首页 > 其他分享 >[Note] POI 板刷寄录 II

[Note] POI 板刷寄录 II

时间:2022-08-26 08:11:07浏览次数:182  
标签:frd 板刷 di Note int GC 寄录 hd define

来点大紫大黑

[POI2013]LUK-Triumphal arch

A 的窝火。显然是二分,树形 dp check 一下即可。

这边证伪一下一种贪心 check:

首先我们从根节点 \(1\) 开始 dfs 全树。

同时记录一个变量 \(less\)。

如果当前的 $k 和 \(less\) 的和比儿子的数量少,肯定不行。

否则就 \(less\leftarrow less-\texttt{当前节点儿子数量}+k\),然后去判断儿子是不是都合法。


这种做法为什么是错的呢?

这种贪心写法错误在于你假装把剩余涂成黑点的机会滞后了,但是事实上在现实中并没有滞后,就是你必须在那一轮就涂下。

这样就会出现这样一个问题:如果有两棵的子树都通过利用 剩余涂成黑点的机会 滞后,但事实上纵观全局不一定能达成这样的效果,因为事实上你两棵子树都需要利用这个机会,但是你却在贪心过程中只让一颗子树利用这样的机会,所以是谬误的。

#include <bits/stdc++.h>
#define GC c=getchar()
#define IG isdigit(c)
#define int long long
#define rep(i,l,r) for(int i(l),_##i(r);i<=_##i;++i)
#define per(i,r,l) for(int i(r),_##i(l);i>=_##i;--i)
#define Go(i,hd,v) for(int i(hd),v;v=to[i],i;i=nxt[i])
template<class T=int>T frd(T x=0,char GC,bool f=1)
{
	for(;!IG;GC)f=c!='-';for(;IG;GC)x=x*10+(c^48);return f?x:-x;
}
using namespace std;
const int N(3e5+5);
int n,hd[N+5],to[N*2+5],nxt[N*2+5],deg[N+5],cntE,f[N+5];
inline void add(int u,int v){nxt[++cntE]=hd[u],hd[u]=cntE,to[cntE]=v,++deg[u];}
inline void Add(int u,int v){add(u,v),add(v,u);}
int dfs(int u,int sum,int fa)
{
	f[u]=deg[u]-sum;
	Go(i,hd[u],v) if(v!=fa) f[u]+=max(dfs(v,sum,u),0ll);
	return f[u];
}
signed main()
{
	n=frd();
	rep(i,2,n)Add(frd(),frd()),--deg[i];
	int L(0),R(n);
	while(L<R)
	{
		int mid(L+R>>1);
		dfs(1,mid,0)<=0?R=mid:L=mid+1;
	}
	printf("%lld\n",L);
	return 0;
}

[POI2015] KUR

这种计数很罕见。

我们直接去找有多少个起始位置符合条件。

显然当一个起始位置 \(start\) 符合条件,以 \(s_i = 0\) 为例必有

对于任意一个 \(i\in [1,m]\) 都有 \(a(start-1+i)+b \mod n < p\)。

为了方便我们 \(start\leftarrow start-1\)。

所以就是 \(a*start+(a*i+b) \mod n < p\)。

然后发现对于任意的一个 \(a*start\) 都有唯一确定的 \(start\) 与之对应(因为 \((a,n)=1\))。

而 \(a*start\) 的解集是连续的(可能不太必要的限定:在 \(\mod n\) 的情况下)。那么只要一个点被覆盖了 \(m\) 次即可。

但是,坑点是 \(q\in [n-m+1,n-1]\) 时是不合法的!!!

最后直接去除这种不合法情况即可。。

#include <bits/stdc++.h>
#define GC c=getchar()
#define IG isdigit(c)
#define rep(i,l,r) for(int i(l),_##i(r);i<=_##i;++i)
#define per(i,r,l) for(int i(r),_##i(l);i>=_##i;--i)
#define Go(i,hd,v) for(int i(hd),v;v=to[i],i;i=nxt[i])
template<class T=int>T frd(T x=0,char GC,bool f=1)
{
	for(;!IG;GC)f=c!='-';for(;IG;GC)x=x*10+(c^48);return f?x:-x;
}
using namespace std;
const int N(1e6+5);
int n,a,b,p,m,di[N*2+5],cntd,l[N+5],r[N+5],del[N+5],d[N*2+5],ans;
char s[N+5];
inline int ask(int x) {return lower_bound(di+1,di+1+cntd,x)-di;}
signed main()
{
	n=frd(),a=frd(),b=frd(),p=frd(),m=frd();
	scanf("%s",s+1);
	rep(i,1,m)  
	{
		int t((1ll*a*i+b)%n);
		if(s[i]^48) l[i]=p-t-1,r[i]=n-1-t;
		else l[i]=n-t-1,r[i]=p-1-t;
		if(l[i]<0)l[i]+=n;if(r[i]<0)r[i]+=n;
		di[++cntd]=l[i],di[++cntd]=r[i];
	}
	di[0]=-1,di[++cntd]=0,di[++cntd]=n-1;
	rep(i,n-m+1,n-1) del[n-i]=1ll*a*i%n;
	sort(di+1,di+1+cntd),sort(del+1,del+m);
	cntd=unique(di+1,di+1+cntd)-(di+1);
	rep(i,1,m)
	{
		l[i]=ask(l[i]),r[i]=ask(r[i]);
		--d[l[i]],++d[r[i]],l[i]>r[i]&&(++d[cntd]);
	}
	int npos(m-1);
	per(i,cntd,1)
	{
		d[i]+=d[i+1];int cnt(0);
		while(npos&&del[npos]>di[i-1]) --npos,++cnt;
		if(d[i]==m) ans+=di[i]-di[i-1]-cnt;
	}
	printf("%d\n",ans);
	return 0;
}

another

#include <bits/stdc++.h>
#define GC c=getchar()
#define IG isdigit(c)
#define rep(i,l,r) for(int i(l),_##i(r);i<=_##i;++i)
#define per(i,r,l) for(int i(r),_##i(l);i>=_##i;--i)
#define Go(i,hd,v) for(int i(hd),v;v=to[i],i;i=nxt[i])
template<class T=int>T frd(T x=0,char GC,bool f=1)
{
	for(;!IG;GC)f=c!='-';for(;IG;GC)x=x*10+(c^48);return f?x:-x;
}
using namespace std;
const int N(1e6+5);
int n,a,b,p,m,di[N*3+5],cntd,l[N+5],r[N+5],del[N+5],d[N*3+5],cntp,ans;
char s[N+5];
inline int ask(int x) {return lower_bound(di+1,di+1+cntd,x)-di;}
signed main()
{
	n=frd(),a=frd(),b=frd(),p=frd(),m=frd();
	scanf("%s",s+1);
	rep(i,1,m)  
	{
		int t((1ll*a*i+b)%n);
		if(s[i]^48) l[i]=p-t,r[i]=n-t;
		else l[i]=n-t,r[i]=p-t; 
		if(l[i]<0)l[i]+=n;if(r[i]<0)r[i]+=n; 
		di[++cntd]=l[i],di[++cntd]=r[i];
	}
	di[++cntd]=0,di[++cntd]=n;
	rep(i,n-m+1,n-1) del[n-i]=1ll*a*i%n;
	sort(di+1,di+1+cntd),sort(del+1,del+m);
	cntd=unique(di+1,di+1+cntd)-(di+1);
	rep(i,1,m)
	{
		l[i]=ask(l[i]),r[i]=ask(r[i]);
		++d[l[i]],--d[r[i]];
		if(l[i]>=r[i]) ++d[1];
	}
	int npos(1);
	rep(i,1,cntd-1)
	{
		d[i]+=d[i-1];int cnt(0);
		while(npos<m&&del[npos]<di[i+1])++npos,++cnt;
		if(d[i]==m) ans+=di[i+1]-di[i]-cnt;
	}
	printf("%d\n",ans);
	return 0;
}

标签:frd,板刷,di,Note,int,GC,寄录,hd,define
From: https://www.cnblogs.com/1l2u3o/p/16626366.html

相关文章

  • jupyter notebook的安装和基本使用
    1.人工智能发展必备三要素数据算法计算力计算力之CPU和GPU的区别:CPU主要适用于I/O密集型的任务GPU主要适用于计算密集型任务2.人工智能,机器学习,深度学习三......
  • 为Jupyter notebook创建新kernel
    在新的虚拟环境中创建kernel进入需要创建kernel的虚拟环境condaactivatepytorch安装ipykernelipykernel是必须安装的,也可以直接安装jupyter,会自动包含ipykernelpi......
  • Endnote 关于GBT7714格式参考文献注意事项
    国内学校对参考文献的要求并不统一,虽然都说是按照GBT7714,但是细节各有不同,还有的在用GBT7714-2005版本的,真让人头大在官网下载的GBT7714style,和我们平常需要的格式就不一......
  • linux kernal note
    linuxkernalnote内核体系结构内核由五个模块构成进程调度模块(核心)内存管理模块文件系统模块进程间通信模块网络接口模块 内存管理内存条分区内存分为以下几......
  • Mac安装python jupyter notebook
    前置条件:已安装python3查看当前python版本:python--version如果不使用虚拟环境,直接用步骤3和步骤4即可。1.创建虚拟环境:pip3installvirtualenvpython3-mvirtuale......
  • 【长期】板刷Codeforces 1500-1700 的构造题
    【长期】板刷Codeforces1500-1700的构造题https://codeforces.com/problemset/page/1?tags=constructive+algorithms%2C1500-1700&order=BY_RATING_ASC每天三道,记录一......
  • Notepad plus 通过NppExec插件编译/运行 golang,php,python等语言
        1. 在Notepadplus的插件-->插件管理中,添加nppExec插件。          2.打开插件-->NppExec,选择Showconsole,和Follow($CURRE......
  • 解决Notepad++ 中写的代码粘贴到博客园中,代码对不齐问题
    在Notepad++中写代码之前,在 设置->首选项..   在首选项页面上,进行如下操作,将制表符都替换为空格,就OK了  可以在视图->显示符号 -> 显示空格与制......
  • juypter notebook中报找不到scipy,torchvision的问题
    在初入深度学习使用juypter这块经常遇到各种问题,每次都被搞的很痛苦; 下面给大家带来我的一点问题解决方案: 首先检查下anaconda中有没有安装scipy这些模块,没有的话在......
  • Notepad++ 怎么以json格式显示数据 notepad++怎么安装JSON Viewer插件
    Notepad++安装JSONViewer插件,就可以以json格式显示数据,点击插件-->插件管理;  弹出的插件管理窗口,在“可用”栏目的搜索框写入“JSONViewer”会自动搜到该插件......