csp-s模拟100,101T1,T2题解
题面:https://www.cnblogs.com/Juve/articles/11799325.html
我太蒻了只会T1T2
组合:
欧拉路板子?不会呀。。。
然后打了个优化,防止暴栈
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<vector>
- using namespace std;
- inline int read(){
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
- return x*f;
- }
- const int MAXN=4e5+;
- int t,n,m,fa[MAXN],du[MAXN],edge,sta[MAXN<<],top=,deg[MAXN];
- int to[MAXN<<],nxt[MAXN<<],pre[MAXN],cnt=,id[MAXN<<];
- void add(int u,int v,int idd){
- ++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt,id[cnt]=idd;
- }
- int find(int x){
- return fa[x]=(fa[x]==x?x:find(fa[x]));
- }
- bool vis[MAXN<<],visit[MAXN];
- void dfs1(int x,int edge){
- for(int i=pre[x];i;i=nxt[i]){
- if(vis[i]||vis[i^]) continue;
- int y=to[i];
- vis[i]=vis[i^]=;
- pre[x]=i;
- dfs1(y,i);
- i=pre[x];
- }
- sta[++top]=edge;
- }
- void work1(){
- for(int i=,u,v;i<=m;++i){
- u=read(),v=read();
- add(u,v,i),add(v,u,i);
- visit[u]=visit[v]=;
- ++du[u],++du[v];
- fa[find(v)]=find(u);
- }
- int num=,st=,numm=;
- for(int i=;i<=n;++i){
- if(!visit[i]) continue;
- if(fa[i]==i) ++num;
- if(du[i]&) st=i,++numm;
- }
- if(num>||(numm!=&&numm!=)){
- puts("NO");
- return ;
- }
- dfs1(st,);
- if(top!=m+){
- puts("NO");
- return ;
- }
- puts("YES");
- while(top){
- if(sta[top]!=){
- int p=sta[top];
- int q=p^;
- if(p>q) printf("%d ",-id[p]);
- else printf("%d ",id[p]);
- }
- --top;
- }
- puts("");
- }
- void dfs2(int x,int edge){
- for(int i=pre[x];i;i=nxt[i]){
- if(vis[i]) continue;
- int y=to[i];
- vis[i]=;
- pre[x]=i;
- dfs2(y,i);
- i=pre[x];
- }
- sta[++top]=edge;
- }
- void dfs(int x){
- visit[x]=;
- for(int i=pre[x];i;i=nxt[i]){
- if(visit[to[i]]) continue;
- dfs(to[i]);
- }
- }
- void work2(){
- for(int i=,u,v;i<=m;++i){
- u=read(),v=read();
- add(u,v,i);
- ++du[u],++deg[v];//出度,入度
- }
- int st=,ed=;
- for(int i=;i<=n;++i){
- if(deg[i]==du[i]+){
- if(!ed) ed=i;
- else{
- puts("NO");
- return ;
- }
- }
- else if(deg[i]+==du[i]){
- if(!st) st=i;
- else{
- puts("NO");
- return ;
- }
- }
- else if(deg[i]!=du[i]){
- puts("NO");
- return ;
- }
- }
- if(!st){
- for(int i=;i<=n;++i)
- if(du[i]){
- st=i;
- break;
- }
- }
- dfs(st);
- for(int i=;i<=n;++i)
- if(!visit[i]&°[i]!=){
- puts("NO");
- return ;
- }
- dfs2(st,);
- puts("YES");
- while(top){
- if(sta[top]!=){
- int p=sta[top];
- printf("%d ",id[p]);
- }
- --top;
- }
- puts("");
- }
- signed main(){
- freopen("merge.in","r",stdin);
- freopen("merge.out","w",stdout);
- t=read(),n=read(),m=read();
- //cout<<t<<' '<<m<<' '<<n<<endl;
- for(int i=;i<=n;++i) fa[i]=i;
- if(t==) work1();
- else work2();
- return ;
- }
统计:
对于一个点,如果它被排序了,那么以它构成的逆序对就全消失了,所以对于每个点在hash表中统计是否有贡献,没有就跳过
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define int long long
- #define re register
- using namespace std;
- const int MAXN=2e5+,mod=;
- int n,m,a[MAXN],ans=,sta[MAXN],top=;
- bool vis[MAXN];
- int c[MAXN],f[MAXN];
- inline int lowbit(re int x){
- return x&-x;
- }
- inline void update(re int pos,re int val){
- for(re int i=pos;i<=n;i+=lowbit(i)){
- c[i]+=val;
- }
- }
- inline int query(re int pos){
- re int res=;
- for(re int i=pos;i>;i-=lowbit(i)){
- res+=c[i];
- }
- return res;
- }
- struct hash_map{
- int head[mod+],nxt[MAXN],val[MAXN],to[MAXN],tot;
- int &operator [](int v){
- int x=v%mod;
- for(int i=head[x];i;i=nxt[i]){
- if(to[i]==v) return val[i];
- }
- to[++tot]=v,nxt[tot]=head[x],head[x]=tot;
- return val[tot]=;
- }
- }mp;
- signed main(){
- freopen("count.in","r",stdin);
- freopen("count.out","w",stdout);
- scanf("%lld%lld",&n,&m);
- for(re int i=;i<=n;++i){
- scanf("%lld",&a[i]);
- }
- for(re int i=n;i>=;--i){
- re int t=query(a[i]-);
- ans+=t;
- f[i]=t;
- update(a[i],);
- mp[i]=t;
- }
- printf("%lld ",ans);
- for(re int i=,p;i<=m;++i){
- scanf("%lld",&p);
- if(!mp[p]){
- printf("%lld ",ans);
- continue;
- }
- for(int j=p;j<=n;++j){
- if(!mp[j]) continue;
- if(a[j]<=a[p]){
- mp[j]=;
- ans-=f[j];
- }
- }
- printf("%lld ",ans);
- }
- puts("");
- return ;
- }
点亮:不会
五子棋:模拟没啥可说的
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- int n,mp[][],x,y;
- bool check(int h,int l,int val){
- int i=h,j=l,t=;
- while(i->&&mp[i-][j]==val) --i;
- t+=h-i+;
- i=h;
- while(i+<=&&mp[i+][j]==val) ++i;
- t+=i-h;
- //cout<<t<<endl;
- if(t>=) return ;
- i=h,j=l,t=;
- while(j->&&mp[i][j-]==val) --j;
- t+=l-j+;
- j=l;
- while(j+<=&&mp[i][j+]==val) ++j;
- t+=j-l;
- //cout<<t<<endl;
- if(t>=) return ;
- t=,i=h,j=l;
- while(i->&&j+<=&&mp[i-][j+]==val) --i,++j,++t;
- i=h,j=l;
- while(i+<=&&j->&&mp[i+][j-]==val) ++i,--j,++t;
- //cout<<t<<endl;
- if(t>=) return ;
- t=,i=h,j=l;
- while(i->&&j->&&mp[i-][j-]==val) --i,--j,++t;
- i=h,j=l;
- while(i+<=&&j+<=&&mp[i+][j+]==val) ++i,++j,++t;
- //cout<<t<<endl;
- if(t>=) return ;
- return ;
- }
- int main(){
- freopen("five.in","r",stdin);
- freopen("five.out","w",stdout);
- scanf("%d",&n);
- for(int i=;i<=n;++i){
- scanf("%d%d",&x,&y);
- mp[x][y]=(i&)+;
- if(check(x,y,mp[x][y])){
- if(i&) printf("A %d\n",i);
- else printf("B %d\n",i);
- return ;
- }
- /*for(int j=1;j<=15;++j){
- for(int p=1;p<=15;++p){
- cout<<mp[j][p]<<' ';
- }
- cout<<endl;
- }*/
- }
- puts("Tie");
- return ;
- }
迷宫:
对于dij进行改造
首先是跑一个多源点dijkstra,在跑的过程中对于每个点维护一个堆,堆中存的是这个点到其他源点的d+1短路,每次用堆顶更新,因为其他的d短路会被我们卡掉,初始时如果是源点就在堆中插0,否则插inf,更新时维护堆的大小不超过d+1,因为是大根,所以如果一个点不是源点且堆内元素小于d+1,则说明到这个点我们可以把所有d条能到达源点的边都删掉,所以不能更新,此时堆顶是inf,所以是对的
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #define int long long
- using namespace std;
- const int MAXN=1e5+5,MAXM=1e6+5,inf=0x3f3f3f3f3f3f3f3f;
- int n,m,k,d,p[MAXN],ans=0;
- bool vis[MAXN],is[MAXN];
- int to[MAXM<<1],nxt[MAXM<<1],pre[MAXN],val[MAXM<<1],cnt=0;
- void add(int u,int v,int w){
- ++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt,val[cnt]=w;
- }
- priority_queue< pair<int,int> >q;
- priority_queue<int>dis[MAXN];
- void dijkstra(){
- for(int i=1;i<=n;++i){
- if(!is[i]) dis[i].push(inf);
- else{
- dis[i].push(0);
- q.push(make_pair(0,i));
- }
- }
- while(!q.empty()){
- int x=q.top().second;
- q.pop();
- if(vis[x]) continue;
- vis[x]=1;
- for(int i=pre[x];i;i=nxt[i]){
- int y=to[i];
- if(dis[y].top()>dis[x].top()+val[i]){
- dis[y].push(dis[x].top()+val[i]);
- while(dis[y].size()>d+1) dis[y].pop();
- q.push(make_pair(-dis[y].top(),y));
- }
- }
- }
- }
- signed main(){
- freopen("maze.in","r",stdin);
- freopen("maze.out","w",stdout);
- scanf("%lld%lld%lld%lld",&n,&m,&k,&d);
- for(int i=1,u,v,w;i<=m;++i){
- scanf("%lld%lld%lld",&u,&v,&w);
- add(u+1,v+1,w),add(v+1,u+1,w);
- }
- for(int i=1;i<=k;++i){
- scanf("%lld",&p[i]);
- ++p[i],is[p[i]]=1;
- }
- dijkstra();
- printf("%lld\n",dis[1].top()==inf?-1:dis[1].top());
- return 0;
- }
三华聚顶:不会
csp-s模拟100,101T1,T2题解的更多相关文章
- NOIP 模拟赛 day5 T2 水 故事题解
题目描述 有一块矩形土地被划分成 \(\small n×m\) 个正方形小块.这些小块高低不平,每一小块都有自己的高度.水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中 ...
- 【2018暑假集训模拟一】Day1题解
T1准确率 [题目描述] 你是一个骁勇善战.日刷百题的OIer. 今天你已经在你OJ 上提交了y 次,其中x次是正确的,这时,你的准确率是x/y.然而,你最喜欢一个在[0; 1] 中的有理数p/q(是 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- 10-18 noip提高组模拟赛(codecomb)T2贪心
T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...
- NOIP2017普及组T2题解
还是神奇的链接 上面依然是题目. 这道题依然很简单,比起2015年的普及组t2好像还是更水一些. 不过这道题能讲的比第一题多. 我们一起来看一下吧! 这一题,我们首先将书的编号全部读入,存在一个数组里 ...
- 【2018暑假集训模拟一】Day2题解
T1 园艺工人的求助 [题目描述]终于,在一段繁忙的训练之后,到了NOIP 的举办的时候.同学们坐上了大巴车,享受着沿途的风光,讨论着未解决的问题,憧憬着NOIP 赛场上切题的样子.很快,大巴车到了大 ...
- noip提高组模拟赛(QBXT)T2
T2count题解 [ 问题描述]: 小 A 是一名热衷于优化各种算法的 OIER,有一天他给了你一个随机生成的 1~n 的排列, 并定 义区间[l,r]的价值为: \[ \huge C_{l,r}= ...
- 【20180808模拟测试】T2 k-斐波那契
描述 k-斐波拉契数列是这样的 f(0)=k;f(1)=k;f(n)=(f(n-1)+f(n-2))%P(n>=2); 现在我们已经知道了f(n)=1,和P: k的范围是[1,P); 求k的所有 ...
- 【20180807模拟测试】T2 box
[问题描述] 有个桌子长 R 宽 C,被分为 R*C 个小方格.其中,一些方格上有箱子,一些方格上有按 钮,一些方格上有障碍物,一些方格上是空地.现在有个任务,需要把所有箱子推到这些按 钮上面.箱子有 ...
随机推荐
- Reqests----Get请求之参数化
一.环境安装 >>pip install requests 注意:pip很容易就会版本升级,如果用python3的,请使用pip3 install requests 1.初始化版本 2.把 ...
- 自定义可点击的ImageSpan并在TextView中内置“View“
有的时候可能想在TextView中添加一些图片,比如下图,发短信输入联系人时,要把联系人号码换成一个图片,但这个图片无法用固定的某张图,而是根据内容进行定制的,这更像一个view. 当然,如果你不是v ...
- android Intent和IntentFilter
android的应用程序包含三种重要的组件:Activity.Service.BroadcastReceiver,应用程序采用一致的方式来启动他们——都是依靠Intent来进行启动.Intent就封装 ...
- myEclipse环境下配置springMvc项目,进行简单的请求
1."File-->New-->WebProject"新建一个web项目,命名为springMvc 2.将所需要用到的jar包复制到WEB-INF/lib路径下,然后右 ...
- Yacc - 一个生成 LALR(1) 文法分析器的程序
SYNOPSIS 总览 yacc [ -dlrtv ] [ -b file_prefix ] [ -p symbol_prefix ] filename DESCRIPTION 描述 Yacc 从 f ...
- AWS lambda DynamoDB api gateway之间的连接
创建角色 附加策略 AmazonDynamoDBFullAccess AWSLambdaDynamoDBExecutionRole 创建DynamoDB表 在表的项目中创建内容 this pipi 打 ...
- PHP算法之有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可被认为是 ...
- 本地项目上传github
(1)github上面新建仓库 (2) 1. git init //初始化仓库 2. git add .(文件name) //添加文件到本地仓库 3. git commit -m "firs ...
- kafka集群安装和使用
kafka(1)kafka是一个分布式的消息缓存系统(2)kafka集群中的服务器都叫做broker(3)kafka有两类客户端,一个叫做producer(消息生产者),一类叫做consumer(消息 ...
- NX二次开发-UFUN工程图表格注释获取某一行的tag函数UF_TABNOT_ask_nth_row
NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...