zoukankan      html  css  js  c++  java
  • hdu5023--A Corrupt Mayor's Performance Art

    来源:2014 ACM/ICPC Asia Regional Guangzhou Online

    题意:长度为n的一个线段,1-30为颜色代号。初始状态每个单位长度颜色都为2,然后有q次操作,P操作把区间内的颜色全部换为别的颜色,Q操作从小到大输出区间内所有的颜色代号。

    线段树区间更新(裸题),一场网络赛让我学会了区间更新。

    #include <set>
    #include <map>
    #include <cmath>
    #include <ctime>
    #include <queue>
    #include <stack>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef unsigned long long ull;
    typedef long long ll;
    const int inf = 0x3f3f3f3f;
    const double eps = 1e-8;
    const int maxn = 1e6+10;
    int n,m,seg[maxn<<2];
    bool ans[35];
    void push_down(int l,int r,int pos)
    {
    	if (~seg[pos])
    	{
    		seg[pos<<1] = seg[pos<<1|1] =seg[pos];
    	}
    	seg[pos] = -1;
    }
    void push_up(int l,int r,int pos)
    {
    	if (seg[pos<<1] == seg[pos<<1|1])
    		seg[pos] = seg[pos<<1];
    	else
    		seg[pos] = -1;
    }
    void update(int l,int r,int pos,int ua,int ub,int col)
    {
    	if (ua <= l && ub >= r)
    	{
    		seg[pos] = col;
    		return;
    	}
    	if (~seg[pos])
    		push_down(l,r,pos);
    	int mid = (l + r) >> 1;
    	if (ua <= mid)
    		update(l,mid,pos<<1,ua,ub,col);
    	if (ub > mid)
    		update(mid+1,r,pos<<1|1,ua,ub,col);
    	push_up(l,r,pos);
    }
    void query(int l,int r,int pos,int ua,int ub)
    {
    	if (~seg[pos])
    	{
    		ans[seg[pos]] = 1;
    		return;
    	}
    	int mid = (l + r) >> 1;
    	if (ua <= mid)
    		query(l,mid,pos<<1,ua,ub);
    	if (ub > mid)
    		query(mid+1,r,pos<<1|1,ua,ub);
    }
    int main(void)
    {
        #ifndef ONLINE_JUDGE
            freopen ("in.txt","r",stdin);
        #endif
        while (scanf ("%d%d",&n,&m),n&&m)
    	{
    		update(1,n,1,1,n,2);
    		for (int i = 0; i < m; i++)
    		{
    			char cmd[5];
    			scanf ("%s",cmd);
    			if (cmd[0] == 'P')
    			{
    				int x,y,z;
    				scanf ("%d%d%d",&x,&y,&z);
    				update(1,n,1,x,y,z);
    			}
    			if (cmd[0] == 'Q')
    			{
    				int x,y;
    				scanf ("%d%d",&x,&y);
    				memset(ans,0,sizeof(ans));
    				query(1,n,1,x,y);
    				bool first = 0;
    				for (int i = 1; i <= 30; i++)
    				{
    					if (ans[i])
    					{
    						if (!first)
    							printf("%d",i),first = 1;
    						else
    							printf(" %d",i);
    					}
    				}
    				printf("
    ");
    			}
    		}
    	}
        return 0;
    }
    

      

  • 相关阅读:
    ORACLE日期时间函数大全
    orcal基础
    javaweb学习总结——基于Servlet+JSP+JavaBean开发模式的用户登录注册
    一个DataTable赋值给另一个DataTable的常用方法
    ios开发 解释器和编译器
    ios面试题(五)-多线程
    ios面试题(四)-block
    ios面试题(三)
    ios开发面试题(二)
    ios开发面试题(一)
  • 原文地址:https://www.cnblogs.com/oneshot/p/3985038.html
Copyright © 2011-2022 走看看