Codeforces1101 | EducationalRound58 | 瞎讲报告
目录
A,B,C,D,E都是几个月前写的。。现在终于把这个坑填上了qwwwwq
Educational Codeforces Round 58 (Rated for Div. 2)
顺便把网址也给输了进去..23333
这场是2019.01.12早上vp的呢..
达成任务(雾
- [x] 被hack*1
A. Minimum Integer
乱搞
一如既往是道乱搞2333
问在区间\([l,r]\)外的\(d\)的倍数的最小值
显然最小是\(d\)如果不满足 就在离\(r\)最近的地方去选即可
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
int main(){
int q;scanf("%d",&q);
fr(i,1,q){
LL x,y,d;scanf("%lld%lld%lld",&x,&y,&d);
if(d<x) printf("%lld\n",d);
else {
LL pos=y/d;
printf("%lld\n",(pos+1)*d);
}
}
return 0;
}
B. Accordion
字符串
贪心
找[:||:]
的字符串最长是多少
贪心找最前面的[
与最后的]
即可
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
const int N=5e5+10;
char lx[N];
int be=-1,ed=-1;
int m[N],s[N];
void fail(){
printf("-1\n");
exit(0);
}
int main(){
scanf("%s",lx+1);
int len=strlen(lx+1);
int ct=-1,rs=-1,nm=0,kk=0;
fr(i,1,len){
if(lx[i]=='['&&be==-1) be=i;
if(lx[i]==']') ed=i;
if(lx[i]==':') m[++kk]=i;
if(lx[i]=='|') s[++nm]=i;
}
if(be==-1||ed==-1||be>ed) fail();
int ans=4;
fr(i,1,kk){
if(m[i]<be) continue;
if(m[i]>ed) break;
if(m[i]>be&&rs==-1) rs=m[i];
ct=m[i];
}
if(ct==rs) fail();
fr(i,1,nm){
if(s[i]>rs&&s[i]<ct) ans+=1;
}
printf("%d\n",ans);
return 0;
}
C. Division and Union
贪心
思维
至于为什么写上思维..因为我没有思维..
感觉这道题很水..
但在真正vp的时候就gg..
没有想到很简便的算法就开始码..
大概是T2Wa了好几发+被Hack了心态上还是有点影响的吧..
但冷静下来还是把这道题给A啦!!
只需找到这个即可
fr(i,2,n){
if(a[i].l>maxn) {be=i;break;}
b[i]=1;
maxn=max(maxn,a[i].r);
}
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
const int N=1e5+10;
struct data{
int l,r;
int rk;
}a[N];
int b[N],ys[N],one[N],tw[N];
bool comp(data xx,data yy){
if(xx.l!=yy.l) return xx.l<yy.l;
else return xx.r<yy.r;
}
int main(){
int T;scanf("%d",&T);
fr(o,1,T){
int n;scanf("%d",&n);
fr(i,1,n){
scanf("%d%d",&a[i].l,&a[i].r);a[i].rk=i;
}
sort(a+1,a+1+n,comp);
int be=-1,maxn=a[1].r;b[1]=1;
fr(i,2,n){
if(a[i].l>maxn) {be=i;break;}
b[i]=1;
maxn=max(maxn,a[i].r);
}
if(be==-1) printf("%d\n",be);
else {
fr(i,be,n) b[i]=2;
fr(i,1,n) ys[a[i].rk]=b[i];
fr(i,1,n) printf("%d ",ys[i]);
printf("\n");
}
}
return 0;
}
D.GCD Counting
点分治
这道题大概是vp快结束的时候想到了点分治吧...
然后和ymz大仙讲了一下..
好像真的可以用点分治做耶..
感觉点分治就是那个套路吧...
主要就是计算答案的时候函数写得不一样??
好像其他的都是一样的说QAQ
自己的思路已经差不多了..
分解质因数什么的都已经想到了..
当然只需维护最大值还是要%%%ymz大仙..
自己想的话大概就维护两个最大值吧
大概和自己早上想那道hdu的点分治差不多..
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i<=y;--i)
#define LL long long
using namespace std;
const int M=2e5,N=2e5+10,K=2e4+10;
struct data{
int nt,to;
}a[N<<1];
vector<int>qx[N];
int f[N],dep[N],w[N],head[N],B[K],H[K];
int ys[N],vis[N],g[N],sz[N],yz[N],val[N];
int cnt=0,ans=0,zy=0;
void add(int x,int y){
a[++cnt].to=y,a[cnt].nt=head[x],head[x]=cnt;
a[++cnt].to=x,a[cnt].nt=head[y],head[y]=cnt;
}
void init(){
fr(i,2,M){
int len=sqrt(i),flg=0,x=i;
fr(j,2,len){
if(x%j==0){
flg=1;
qx[i].push_back(yz[j]);
while(x%j==0) x/=j;
}
if(x==1) break;
}
if(!flg) yz[i]=++zy,ys[zy]=i,qx[i].push_back(zy);
}
}
int Get(int u,int fa){
sz[u]=1,f[u]=fa,g[u]=u;
for(int i=head[u];i;i=a[i].nt){
int to=a[i].to;
if(to==fa||vis[to]) continue;
Get(to,u);
sz[u]+=sz[to];
}
int pos=-1;
for(int i=head[u];i;i=a[i].nt){
int to=a[i].to;
if(to==fa||vis[to]) continue;
if(sz[to]*2>=sz[u]) pos=g[to];
}
if(pos==-1) return g[u];
while(sz[f[pos]]*2<=sz[u]) pos=f[pos];
return g[u]=pos;
}
int UPD(int x,int y){
int len=qx[x].size(),pos=1;
fr(i,0,len-1){
H[qx[x][i]]=max(H[qx[x][i]],y);
pos*=ys[qx[x][i]];
}
return pos;
}
int upd(int x,int y,int v){
int len=qx[x].size(),pos=1;
fr(i,0,len-1){
if(v%ys[qx[x][i]]==0) {
B[qx[x][i]]=max(B[qx[x][i]],y);
pos*=ys[qx[x][i]];
}
}
return pos;
}
void find(int u,int fa){
for(int i=head[u];i;i=a[i].nt){
int to=a[i].to;
if(vis[to]||to==fa) continue;
dep[to]=dep[u]+1;
val[to]=upd(w[to],dep[to],val[u]);
if(val[to]==1) continue;
find(to,u);
}
}
void js(){
fr(i,1,zy){
if(H[i]!=-1&&B[i]!=-1) ans=max(ans,B[i]+H[i]);
H[i]=max(H[i],B[i]);
}
}
void dfs(int u,int fa){
memset(H,-1,sizeof H);
int be=Get(u,fa);//printf("be=%d\n",be);
val[be]=UPD(w[be],0);//printf("val=%d\n",val[be]);
for(int i=head[be];i;i=a[i].nt){
int to=a[i].to;
if(vis[to]) continue;
memset(B,-1,sizeof B);dep[to]=1;
val[to]=upd(w[to],dep[to],val[be]);
find(to,be);
js();
}
vis[be]=1;
for(int i=head[be];i;i=a[i].nt){
int to=a[i].to;
if(vis[to]) continue;
dfs(to,be);
}
}
int main(){
init();
int n;scanf("%d",&n);
fr(i,1,n) scanf("%d",&w[i]);
for(int i=1,x,y;i<n;++i){
scanf("%d%d",&x,&y);
add(x,y);
}
vis[0]=1,dfs(1,0);
if(!ans){
int res=0;
fr(i,1,n){
if(w[i]!=1) res=1;
}
printf("%d\n",ans+res);
}
else printf("%d\n",ans+1);
return 0;
}
E.Polycarp's New Job
贪心
没想到E题还是有点水的233
主要还是看了一下榜单 发现怎么和我排名差不多的人都A了E题啊
那我就去看了看..
如果不知道有很多人A了的话,,大概就不会再看下去了吧..
最后还是很有信仰的证明了一发..
发现直接排个序取max即可啦!
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
int main(){
int n;scanf("%d",&n);
int ma=0,mb=0;
fr(i,1,n){
char ch;cin>>ch;
int a,b;scanf("%d%d",&a,&b);
int x=max(a,b),y=min(b,a);
if(ch=='+'){
ma=max(ma,x),mb=max(mb,y);
//printf("%d %d\n",ma,mb);
} else {
if(ma<=x&&mb<=y) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
发现直接排个序取max即可啦!
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
int main(){
int n;scanf("%d",&n);
int ma=0,mb=0;
fr(i,1,n){
char ch;cin>>ch;
int a,b;scanf("%d%d",&a,&b);
int x=max(a,b),y=min(b,a);
if(ch=='+'){
ma=max(ma,x),mb=max(mb,y);
//printf("%d %d\n",ma,mb);
} else {
if(ma<=x&&mb<=y) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
F.Trucks and Cities
单调
区间DP
什么听说这道题暴力直接二分就可以过?QwQ
我们考虑区间dp
\(dp[i][j][k]\) 从第\(i\)个城市到第\(j\)个城市分成\(k\)段 最长那段的最小值
那么最后我们的答案就是 \(max_{i=1}^m(dp[s][t][r]*c)\)
上述\(dp\)暴力转移:
\[dp[i][j][k]=min_{w=i}^j(max(dp[i][w][k-1],a[j]-a[w]))\]
边界即为 \(dp[i][j][0]=a[j]-a[i]\)
显然不加优化复杂度\(O(n^4)\) TLE稳稳的
这个\(dp\)具有单调性!
设\(dp[i][j][k]\) 在\(max(dp[i][w_1][k-1],a[j]-a[w_1])\) 取到最优值
而\(dp[i][j][k+1]\) 在\(max(dp[i][w_2][k],a[j]-a[w_2])\) 取到最优值
那么有\(w_1 \leq w_2\)
简单理解一下 由于分的段数变多了 总不可能是用越来越少的距离去分段的趴QwQ
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
const int N=401;
int dp[N][N][N],a[N];
int main(){
int n,m;scanf("%d%d",&n,&m);
fr(i,1,n) scanf("%d",&a[i]);
fr(i,1,n) fr(j,i+1,n) dp[i][j][0]=a[j]-a[i];
fr(i,1,n) fr(j,i+1,n){
int w=i;
fr(k,1,n){
while(w+1<=n&&max(dp[i][w+1][k-1],a[j]-a[w+1])<max(dp[i][w][k-1],a[j]-a[w])) w++;
dp[i][j][k]=max(dp[i][w][k-1],a[j]-a[w]);
}
}
LL maxn=0;
fr(o,1,m){
int s,t,c,r;scanf("%d%d%d%d",&s,&t,&c,&r);
maxn=max(maxn,(dp[s][t][r]*1LL*c));
}
printf("%lld\n",maxn);
return 0;
}
G.(Zero XOR Subset)-less
线性基
记\(qz[i]\) 表示前\(i\)个数的异或和
问题可以等价于 \(qz[n]\) 必须选 然后在\(qz[i](1 \leq i \leq n-1)\) 里面选尽量多个使得任意一个子集的异或和不为0
这个可以用线性基来搞..
贪心能选就选即可
再稍微讲一下贪心能选就选的正确性趴。(口胡*1)
如果当前可以选\(qz[i]\) 就选上去 假设\(qz[j]\)就不能选
如果不选上去\(qz[j]\)就可以选(所以选于不选最多只会影响到一个(一个对一个不就抵消了吗QwQ
#inclu de<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define LL long long
using namespace std;
const int N=32,M=2e5+10;
int q[N],qz[M];
bool insert(int x){
rf(i,N-1,0){
if((x>>i)&1){
if(!q[i]){
q[i]=x;
return true;
} else x^=q[i];
}
}
return false;
}
int main(){
int n;scanf("%d",&n);
fr(i,1,n) scanf("%d",&qz[i]);
fr(i,1,n) qz[i]^=qz[i-1];
int ans=0;
if(!qz[n]) return printf("-1\n"),0;
rf(i,n,1){
if(insert(qz[i])) ans++;
}
cout<<ans<<endl;
return 0;
}
Codeforces1101 | EducationalRound58 | 瞎讲报告的更多相关文章
- Codeforces70 | Codeforces Beta Round #64 | 瞎讲报告
目录 前言 正文 A B C D E 前言 这个毒瘤的517 放了Div1 然后D题是昨天讲的动态凸包(啊喂!我还没来的及去写 结果自己想的是二分凸包 (当然没有写出来 写完前两题之后就愉快地弃疗 C ...
- Codeforces1151E,F | 553Div2 | 瞎讲报告
传送链接 E. Number of Components 当时思博了..一直在想对于\([1,r]\)的联通块和\([1,l-1]\)的联通块推到\([l,r]\)的联通块...我真的是傻了..这题明 ...
- AtCoder | ARC103 | 瞎讲报告
目录 ARC 103 A.//// B.Robot Arms C.Tr/ee D.Distance Sums ARC 103 窝是传送门QwQ A.//// 题意 : 给你\(n\)(\(n\)为偶数 ...
- AtCoder | ARC102 | 瞎讲报告
目录 ARC102 前言 正文 传送链接~ ARC102 前言 实在是太菜了....写完第一题就弃疗..感觉T3好歹也是道可做题吧!!然后T2怎么又是进制拆分! 正文 A 题意 给你两个数字\(n,k ...
- Codeforces1084 | Round526Div2 | 瞎讲报告
目录 A. The Fair Nut and Elevator B.Kvass and the Fair Nut C.The Fair Nut and String D.The Fair Nut an ...
- 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)
[背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...
- [NOIP2018模拟赛10.25]瞎搞报告
闲扯 最近有点颓,都修到好晚,早上起来和吔shi一样难受 忍着困意把题面看完,发现啥也不会,又是一场写暴力的模拟赛 T1发现似乎可以DP,顺手码了个 T2像个最小瓶颈路板子,但是只做过N^2算法的.. ...
- <老友记>学习笔记
这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...
- SQL Server数据库定时自动备份
SQL Server 数据库定时自动备份[转] 在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求 ...
随机推荐
- 解决osx下 ssh: connect to host localhost port 22: Connection refused
解决办法: 终端下执行:sudo systmesetup -setremotelogin on
- MySQL无法存储Emoji表情问题
数据插入的时候报错: 1366 - Incorrect string value: '\xF0\x9F\x98\x81' for column 'job' at row 23 解决办法: 1.修改配置 ...
- 垂直方向兼容显示的内容多少的情况样式Flex布局
使用flex弹性布局,无论里面的元素显示几个,都会居中显示,父元素设置成如下样式 display: flex; flex-direction: column; justify-content: cen ...
- 使用Android的OpenGL编写视频播放器
Android自身有MediaPlayer播放器,为什么还要使用OpenGL?因为使用OpenGL可以实现更多的效果,比如对视频翻转一定角度,加任意特效,多视频合并播放等,类似“激萌”的APP应该就是 ...
- 【敏捷实用工具】JIRA介绍以及使用方法
敏捷开发并不是由敏捷工具来推动的.但是没有敏捷工具的支持,就很难进行各种软件工程的相关事件,工具的作用是约束和流程,正确使用敏捷工具可以事半功倍,实践敏捷.近几年来敏捷开发催生大量敏捷工具的产生,在敏 ...
- hadoop日常维护之问题解决01
执行hadoop任务遇到的问题: Caused by: org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/h ...
- SEO优化上首页之搜索引擎蜘蛛Spider原理
Spider,蜘蛛,又名网页网络爬虫.网络机器人,是按照一定策略不断抓取互联网网页的特定程序.蜘蛛抓回的页面创建索引后参与排名,等待用户检索.为了网站优化自然排名上首页,精灵儿工作室下面详细剖析Spi ...
- VB6 写文件
Private Sub Form_Load() Dim nHandle As Integer Dim FilePath As String FilePath = "c:\wgscd\17.t ...
- linux java jdk环境变量设置之后,依旧提示 No such file or directory
今天又默默的在linux下安装java 明明是很简单的事情,在~/.bashrc中添加如下内容: export JAVA_HOME=/home/ubuntu/jdkexport CLASSPATH=. ...
- SSIS 处理错误的方法
Package在执行过程中,不可避免地会发生错误,如果处理错误?简单粗暴的做法,是Package直接停止运行.对于一个成熟的ETL工具,这显然不是唯一的错误处理方法.如果在数据流中出现错误,那么数据流 ...