博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客网暑期ACM多校训练营day4
阅读量:4459 次
发布时间:2019-06-08

本文共 6910 字,大约阅读时间需要 23 分钟。

A  根据题意找出递推式 发现上一项的ans作为下一项的幂次 所以欧拉降幂 (写错递归 背锅背锅

#include
#include
#include
#include
#include
#include
#include
#include
#define N 3000006#define ll long longusing namespace std;const int MAXN=2e5+7;int cnt;char s[MAXN];int mul[N];bool notprime[N];int prime[N];ll c1,c2,c3,c4,c5,c6,c0,c7;long long qpow(long long a,long long b,long long c){ long long t=1;long long e=a; while(b!=0){ if((b&1)==1) t=t*e%c; e=e*e%c; b=b>>1; } return t;} void Prime(){ notprime[1]=1; cnt=0; mul[1]=1; for(int i=2;i

 B DP

队友博客

C 数位dp

队友博客

D 构造 发现偶数项转移规律

#include
using namespace std;int a[205][205];int n;void ycl(){ a[1][1] = 0;a[1][2] = -1; a[2][1] = 1;a[2][2] = 1; for(int nn = 4;nn<=200;nn+=2) { for(int j = 1;j<=nn;j++) a[nn-1][j] = a[j][nn] = -1,a[nn][j] = a[j][nn-1] = 1; a[nn-1][nn-1] = 0; } return ;}int main(){ ycl(); int _;cin>>_; while(_--) { cin>>n; if(n%2 == 1) cout<<"impossible"<

 E 题意题  ....看懂题以后 发现是扫描线线段树板子题  不想写离散化的辣鸡写动态开点调了一天...然后是没有取膜也没开ll 做法还是很明显:动态开点+扫描线线段树

#include 
using namespace std;#define ll long longconst int MAXN=1e5+10;const ll mod=1e9+7;ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x;}ll ksm(ll a,ll b,ll c){ ll ans=1; while(b){ if(b&1)ans=ans*a%c; a=a*a%c;b=b>>1; } return ans;}typedef struct node{ int l,r;ll sum,flag;}node;node d[MAXN*25];int cnt;ll ans=0;void newnode(int &x,int len){x=++cnt;;d[x].l=d[x].r=0;d[x].sum=len;d[x].flag=1;}void up(int x,int l,int r){ int mid=(l+r)>>1; if(!d[x].l)d[x].sum=mid-l+1;else d[x].sum=d[d[x].l].sum*d[d[x].l].flag%mod; if(!d[x].r)d[x].sum+=r-mid;else d[x].sum+=d[d[x].r].sum*d[d[x].r].flag%mod; d[x].sum%=mod;}ll tag,tag1,vul1;void update(int &x,int l,int r,int ql,int qr,ll vul){ if(!x)newnode(x,r-l+1); if(ql<=l&&r<=qr){ d[x].flag=d[x].flag*tag1%mod; vul1=vul*d[x].flag%mod; ans=(ans+tag*(r-l+1)%mod)%mod; ans=(ans+((-1ll*((vul1*(tag*(d[x].sum%mod)%mod))%mod))%mod+mod)%mod)%mod; return ; } int mid=(l+r)>>1; if(ql<=mid)update(d[x].l,l,mid,ql,qr,vul*d[x].flag%mod); if(qr>mid) update(d[x].r,mid+1,r,ql,qr,vul*d[x].flag%mod); up(x,l,r);}int n;typedef struct Node{ ll x,y;ll vul; friend bool operator<(Node aa,Node bb){ if(aa.y==bb.y)return aa.x>bb.x; return aa.y>bb.y; }}Node;Node que[MAXN];vector
vec;void slove(){ n=read();ll t1,t2;ll Xmax=-1,Ymax=-1;vec.clear();cnt=0;ans=0; for(int i=1;i<=n;i++)que[i].x=read(),que[i].y=read(),vec.push_back(que[i].y),t1=read(),t2=read(),Xmax=max(Xmax,que[i].x),Ymax=max(Ymax,que[i].y),que[i].vul=1ll*(t2-t1)*ksm(t2,mod-2,mod)%mod; sort(que+1,que+n+1);ll last=Xmax;tag=0;vec.push_back(0); sort(vec.begin(),vec.end()); int sz=unique(vec.begin(),vec.end())-vec.begin(); t1=sz-1;t2=sz-2; que[n+1].x=que[n+1].y=0; Ymax++; int tot=1;tag1=1ll;int rt=0; while(tot<=n){ tag=vec[t1]-vec[t2]; if(Xmax!=que[tot].x)update(rt,1,last,que[tot].x+1,Xmax,1ll);//cout<
<<"====="<
<<" "<
<
=1){update(rt,1,last,1,Xmax,1ll);Xmax=0;} if(que[tot+1].y!=que[tot].y&&!Xmax){Xmax=last;tag1=1ll;t1=t2;t2--;} tot++; } printf("%lld\n",ans);}int main(){ int _;_=read(); while(_--){ slove(); } return 0;}

 F 签到

#include
using namespace std;char maps[2005][2005];int n,m;int main(){ ios::sync_with_stdio(false); int T; cin>>T; while(T--) { cin>>n>>m; for(int i = 1;i<=n;i++) { for(int j = 1;j<=m;j++) cin>>maps[i][j]; } int heng= 0,shu = 0; for(int i = 1,j = n;i

 G 贪心 二分前缀和即可

#include 
const int MAXN=1e5+10;#define ll long longusing namespace std;int d[MAXN],b[MAXN];vector
vec;ll num[MAXN];int a[MAXN];int main(){ int _;scanf("%d",&_); while(_--){ int n,m;scanf("%d%d",&n,&m); int t; for(int i=1;i<=n;i++)scanf("%d",&a[i]),vec.push_back(a[i]); sort(vec.begin(),vec.end()); int sz=unique(vec.begin(),vec.end())-vec.begin(); for(int i=1;i<=n;i++)a[i]=lower_bound(vec.begin(),vec.begin()+sz,a[i])-vec.begin()+1,d[a[i]]++; for(int i=1;i<=sz;i++)b[i]=d[i]; sort(d+1,d+sz+1); bool flag=0; for(int i=1;i<=sz;i++)num[i]=num[i-1]+d[i]; for(int i=sz-1;i>=0;i--){ int t=b[i+1]; int pos=lower_bound(d+1,d+sz+1,t)-d; ll num1=num[sz]-num[pos-1]-t; ll t1=num1-1ll*(t-1)*(sz-pos); if(t1<=m){flag=1;printf("%d\n",vec[i]);break;} } if(!flag)puts("-1"); vec.clear();memset(num,0,sizeof(num));memset(d,0,sizeof(d)); }}

 J

一个比较神奇的题 首先明白每个不在对应位置的vul 他将收到一段区间的控制(具体是什么区间 自行理解) 如果这段区间最小值是-1 则是不存在的序列 然后想办法和这区间的点建图 但是明显 这个图建图是n^2的 考虑到分块的思想 结合线段树中的分块 我们按照线段树建树优化建图  通过拓扑解决问题(有环 则这个序列不成立)

#include 
#define ll long longconst int MAXN=2e5+10;const int inf=1e9+7;using namespace std;int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return x*f;}int a[MAXN];typedef struct node{ int id,vul; friend bool operator<(node aa,node bb){ return aa.vul>bb.vul; }}node;priority_queue
que;int dp[MAXN][21];int n;int ma[MAXN];int key[MAXN<<2];vector
vec[MAXN<<2];int pos[MAXN];int du[MAXN<<2];void built(int rt,int l,int r){ key[rt]=-1;du[rt]=0; if(l==r){pos[l]=rt;key[rt]=a[l];return ;} vec[rt<<1].clear();vec[rt<<1|1].clear(); vec[rt<<1].push_back(rt); vec[rt<<1|1].push_back(rt); du[rt]+=2; int mid=(l+r)>>1; built(rt<<1,l,mid); built(rt<<1|1,mid+1,r);}void update(int rt,int l,int r,int ql,int qr,int vis){ if(ql<=l&&r<=qr){vec[rt].push_back(vis);du[vis]++;return ;} int mid=(l+r)>>1; if(ql<=mid)update(rt<<1,l,mid,ql,qr,vis); if(qr>mid)update(rt<<1|1,mid+1,r,ql,qr,vis);}void st(){ for(int i=1;i<=n;i++)dp[i][0]=a[i]; for(int j=1;(1<<(j-1))<=n;j++){ for(int i=1;i+(1<
<=n+1;i++){ dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); } }}int rmq(int l,int r){ if(l>r)return inf; int k=ma[r-l+1];int k1=(1<
ans;void bfs(){ for(int i=1;i<=n;i++){ if(!du[pos[i]]&&a[i]!=-1)que.push((node){pos[i],a[i]}); } if(que.empty())return ; while(!que.empty()){ node t=que.top();que.pop(); if(t.vul!=-1)ans.push_back(t.vul); for(int i=0;i
t1){ int t2=rmq(t1,i-1); if(t2==-1){flag=1;break;} update(1,1,n,t1,i-1,pos[i]); } else{ int t2=min(rmq(t1,n),rmq(1,i-1)); if(t2==-1){flag=1;break;} update(1,1,n,t1,n,pos[i]); if(i!=1)update(1,1,n,1,i-1,pos[i]); } } if(!cnt){puts("");continue;} if(flag){puts("-1");continue;} bfs(); if(ans.size()

 

转载于:https://www.cnblogs.com/wang9897/p/9388335.html

你可能感兴趣的文章
Ubuntu各种软件的安装
查看>>
智能社的邀请码
查看>>
算法与分析 统计数字问题和整数因子分解问题?
查看>>
变量提升
查看>>
谜题88:原生类型的处理
查看>>
ajax 415 错误 $.ajax 中的contentType
查看>>
【CodeForces】191C Fools and Roads
查看>>
enum hack
查看>>
2017.2.7 开涛shiro教程-第六章-Realm及相关对象(三)
查看>>
Visual Studio 2008切换到设计视图卡死解决办法-Troubleshooting "Visual Studio 2008 Design view hangs" issues...
查看>>
数据库设计范式
查看>>
sql2005-数据库备份方案 (转载)
查看>>
centos中安装jdk的操作
查看>>
selenium--等待的三种方式
查看>>
nautilus-open-terminal很有用的插件--鼠标右键打开终端
查看>>
android中自定义的dialog中的EditText无法弹出输入法解决方案
查看>>
Android Activity整体管理和关闭工具类封装
查看>>
nginx 安装
查看>>
路径寻找(隐式图遍历)
查看>>
selenium下拉一个框内的滚动条
查看>>