zoukankan      html  css  js  c++  java
  • HZOJ 集合论

    考场用的set,代码复杂度很低,时间复杂度$O(sum log)$,一发过了大样例,以为1e6的数据很稳了就没再管(然后就挂掉了……)

    考后把set化成unordered_set就A了。其实$sum log$的时间复杂度是没有什么问题,只不过有个细节没有考虑好,考场上以为set赋值和clear的复杂度是O1的,然后就挂掉了。

    其实用unordered_set复杂度也不是很对,瓶颈在于赋值和清空。


    题解:

    考虑用set s维护,顺便用一个变量sum维护set中数据的和。

    对于操作1;考虑B集合中的变量a,在s中find(a),若不存在,插入,sum+=a;

    对于操作2:sum=0。考虑B集合中的变量a,在s中find(a),若存在,在另外一个set s1插入a,sum+=a。s=s1,s1.clear()。本人死于此。

    对于操作3,4:对于s中每个数都进行操作显然不可行,那么考虑用一个变量cal维护整体变化值,只需要给操作1,2的a减cal再进行操作即可。

    之后考虑怎么不用set实现:

    我们并不要求数据有序,显然可以用unordered_set,但是其实可以用常数更小的Hash_map实现。

    之后考虑之前的赋值和清空操作:记录一个时间戳即可。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<unordered_set>
    #define LL long long
    using namespace std;
    char xch,xB[1<<15],*xS=xB,*xTT=xB;
    #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++)
    int m;
    
    LL cal=0,sum;
    unordered_set<int>s,s1;
    #define IT set<int>::iterator
    inline int read();
    signed main()
    {
    //	freopen("ex_jihe4.in","r",stdin);
    //	freopen("11.out","w",stdout);
    	
    	m=read();int opt;
    	for(int i=1;i<=m;i++)	
    	{
    		opt=read();
    		if(opt==1)
    		{
    			int siz=read(),a;
    			for(int j=1;j<=siz;j++)
    			{	
    				a=read();a-=cal;
    				if(s.find(a)==s.end())s.insert(a),sum+=a;
    			}
    		}
    		if(opt==2)
    		{
    			int siz=read(),a;sum=0;
    			for(int j=1;j<=siz;j++)	
    			{
    				a=read();a-=cal;
    				if(s.find(a)!=s.end())s1.insert(a),sum+=a;
    			}
    			s=s1;s1.clear();
    		}
    		if(opt==3)
    		{
    			if(!s.empty())cal++;
    		}
    		if(opt==4)
    		{
    			if(!s.empty())cal--;
    		}
    		printf("%lld
    ",sum+cal*s.size());
    	}
    }
    inline int read()
    {
    	int x=0,f=1;char ch=getc();
    	while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getc();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
    	return x*f;
    }
    
  • 相关阅读:
    Lua环境
    WebKit
    Net线程间通信的异步机制
    Cucumber入门1 传统流程下的使用
    Windows Server 2008中安装IIS7.0
    WebCore
    百度云计算平台Python环境试用
    认识ASP.NET MVC的5种AuthorizationFilter
    浅谈java中常见的排序
    go语言中goroutine的使用
  • 原文地址:https://www.cnblogs.com/Al-Ca/p/11695159.html
Copyright © 2011-2022 走看看