zoukankan      html  css  js  c++  java
  • noip模拟70

    还是多校联测,题目不简单。还有就是这次题面描述十分不清楚,第一题理解错了题意。
    考试过程:按顺序开题,首先是T1,我凭着自己的错误理解先打了个暴搜,然后觉得这是个DP,就开始想,我定义了\(f_{i,j,0/1}\)表示当前DP到了第\(i\)位,一共挖去了\(j\)块土地,积水的体积为奇/偶数的方案数,但是我想了半天也没想出来一个正确的转移,就弃了。
    然后是T2,我不会大暴力,就跳了。看T3,我觉得是可做的,先想出来一个40分的做法,然后我觉得正解是利用倍增优化这个不断往后跳的过程,但是我当时不知道为啥就是很怀疑这个想法,就没仔细想,最后也没切掉。然后是T4,没什么时间了,就打了个暴搜。
    总结:如果自己有一些优化的想法就要先想想,不要先怀疑自己。

    T1 暴雨

    留坑

    T2 AV树

    留坑

    T3 挖掘机

    思路:显然每一个深度的影响是独立的,那么我们可以分开计算。首先想到一个暴力的思路,就是对于一段询问的区间,我们找到第一个黑点,让他作为挖掘机的左端点,然后再找到下一个距离当前点大于等于\(k\)的黑点,重复此操作,最后将答案加起来即可。
    考虑优化,我们可以对于每个点预处理出一个倍增数组,这个数组的含义是:在当前的使用一次挖掘机后,再使用\(2^k\)次挖掘机所能到达的黑点,这样我们就可以在\(log\)的复杂度内完成询问。
    代码如下:

    AC_code
    
    #include<bits/stdc++.h>
    #define int long long
    #define re register int
    #define ii inline int
    #define iv inline void
    #define f() cout<<"fuck"<<endl
    #define head heeead
    #define next neet
    using namespace std;
    const int N=1e5+10;
    int dep,wed,k,q;
    char s[15][N];
    int base[15][N][20];
    vector <int> v[15];
    ii read()
    {
    	int x=0;char ch=getchar();bool f=1;
    	while(ch<'0' or ch>'9')
    	{
    		if(ch=='-') f=0;
    		ch=getchar();
    	}
    	while(ch>='0' and ch<='9')
    	{
    		x=(x<<1)+(x<<3)+(ch^48);
    		ch=getchar();
    	}
    	return f?x:(-x);
    }
    signed main()
    {
    	freopen("blueshit.in","r",stdin),freopen("blueshit.out","w",stdout);
    	dep=read(),wed=read(),k=read(),q=read();
    	for(re i=1;i<=dep;i++)
    	{
    		scanf("%s",s[i]+1);
    		for(re j=1;j<=wed;j++) if(s[i][j]=='X') v[i].push_back(j);	
    	}
    	for(re i=1;i<=dep;i++)
    	{
    		if(v[i].size())
    		{
    			for(re j=v[i].size()-1;j>=0;j--)
    			{
    				int pos=upper_bound(v[i].begin(),v[i].end(),v[i][j]+k-1)-v[i].begin();
    				if(pos!=v[i].size())
    				{
    					base[i][v[i][j]][0]=v[i][pos];
    					for(re p=1;v[i][j]+(1<<p)<=wed;p++)
    						base[i][v[i][j]][p]=base[i][base[i][v[i][j]][p-1]][p-1];
    				}
    			}
    		}
    	}
    	int d,l,r,ans;
    	while(q--)
    	{
    		d=read(),l=read(),r=read();
    		ans=0;
    		for(re i=1;i<=d;i++)
    		{
    			int pos=lower_bound(v[i].begin(),v[i].end(),l)-v[i].begin();
    			if(pos==v[i].size() or v[i][pos]>r) continue;
    			++ans;
    			pos=v[i][pos];
    			for(re jbb=19;jbb>=0;jbb--)
    			{
    				if(base[i][pos][jbb]!=0 and base[i][pos][jbb]<=r)
    					ans+=(1ll<<jbb),pos=base[i][pos][jbb];
    			}
    		}
    		printf("%lld\n",ans);
    	}
    	return 0;
    }
    
    
    

    T4 游戏

    留坑

  • 相关阅读:
    Python random() 生成随机数
    【centos7】添加开机启动服务/脚本
    SSH远程会话管理工具
    resolv.conf 的超时(timeout)与重试(attempts)机制
    Linux系统中sysctl命令详解
    NMI watchdog: BUG: soft lockup
    nginx实现最简单的直播
    Linux下编译PHP常见错误及解决方法
    zbb20180919 db 数据库的水平分割和垂直分割
    zbb20180918 java servlet 重定向与请求转发的区别
  • 原文地址:https://www.cnblogs.com/WindZR/p/15374905.html
Copyright © 2011-2022 走看看