Comet OJ - Contest #14
Rank38。
还是比较不满意吧,C卡了太久,E没调出来,D也没空去做了。
A
签到题。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100007;
int x[N],y[N];
ll sqr(ll x){return 1ll*x*x;}
ll dis(ll x,ll y,ll a,ll b){return sqr(x-a)+sqr(y-b);}
int main()
{
ll ans=0,n,i,a,b,x,y,r;
cin>>n>>a>>b>>r;
for(i=1;i<=n;++i)
{
cin>>x>>y;
if(dis(x,y,a,b)<=sqr(r)) ++ans;
}
cout<<ans;
}
B
计算\(p,i,n\)分别最前能放在哪里,\(i,n,k\)最后能放在哪里。
#include<bits/stdc++.h>
using namespace std;
vector<int>pos[5];
const int N=1000007;
char s[N];int n,mp[1001];
int Finda(int x)
{
int p=0;
for(int i=1;i<=x;++i)
{
auto it=lower_bound(pos[i].begin(),pos[i].end(),p);
if(it==pos[i].end()) return -1;
p=pos[i][it-pos[i].begin()];
}
return p;
}
int Findb(int x)
{
int p=n+1;
for(int i=4;i>=x;--i)
{
auto it=upper_bound(pos[i].begin(),pos[i].end(),p);
if(it==pos[i].begin()) return -1;
it=prev(it);
p=pos[i][it-pos[i].begin()];
}
return p;
}
int main()
{
int T,i;scanf("%d",&T);
mp['p']=1,mp['i']=2,mp['n']=3,mp['k']=4;
while(T--)
{
scanf("%d%s",&n,s+1);int f=0,flg=0;
for(i=1;i<=4;++i) pos[i].clear();
for(i=1;i<=n;++i) if(mp[s[i]]) pos[mp[s[i]]].push_back(i);
for(i=1;i<=3;++i)
{
int p1=Finda(i);
if(p1==-1) continue;
int p2=Findb(i+1);
if(p2==-1) continue;
if(p2<p1) continue;
f=max(f,p2-p1-1),flg=1;
}
if(!flg) puts("-1");
else printf("%d\n",f);
}
}
C
设\(f_i\)表示分界点为\(i\)的个数。
对于一次操作\((i,l,r)\)。
我们会在\(l-1,r\)将\(f\)加上\(2^{i-1}\)。
而\([1,l)\cup(r,n]\)这一部分不会变,所以\(f\)要\(*2\)。
#include<bits/stdc++.h>
using namespace std;
const int N=2007,P=20050321;
int a[N];
int read(){int x;scanf("%d",&x);return x;}
int inc(int a,int b){return a+=b,a>=P? a-P:a;}
int mul(int a,int b){return 1ll*a*b%P;}
int power(int a,int k){int r=1;for(;k;k>>=1,a=mul(a,a))if(k&1)r=mul(a,r);return r;}
int main()
{
int n=read(),m=read(),i,l,r,x,ans;
a[0]=1;
for(i=1;i<=m;++i)
{
l=read(),r=read(),x=power(2,i-1),ans=0;
for(int i=0;i<l-1;++i) a[i]=inc(a[i],a[i]);
for(int i=r+1;i<n;++i) a[i]=inc(a[i],a[i]);
a[l-1]=inc(a[l-1],x),a[r]=inc(a[r],x);
for(int i=0;i<n;++i) ans=inc(ans,a[i]);
cout<<ans<<endl;
}
}
D
询问离线右端点升序排序。
用树状数组维护第\(x\)个操作的贡献。
查询就是简单的区间查询。
然后操作可以用珂朵莉树维护序列的极大连续子段,每次暴力修改同时维护树状数组。
#include<bits/stdc++.h>
#define ll long long
#define IT set<node>::iterator
using namespace std;
namespace IO
{
char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[19],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
void Flush(){fwrite(obuf,1,oS-obuf,stdout),oS=obuf;}
void Put(char x){*oS++=x;if(oS==oT)Flush();}
int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
void write(ll x){int top=0;if(!x)Put('0');while(x)st[++top]=(x%10)+48,x/=10;while(top)Put(st[top--]);Put('\n');}
}
using namespace IO;
const int N=500007;
int n,m,Q;ll ans[N];
struct operation{int l,r,v;}opt[N];
struct query{int l,r,id;}q[N];
struct BIT
{
ll t[N];
void add(int p,ll v){if(!p)return;for(;p<=n;p+=p&-p)t[p]+=v;}
ll ask(int p){ll s=0;for(;p;p^=p&-p)s+=t[p];return s;}
ll query(int l,int r){return ask(r)-ask(l-1);}
}bit;
struct node{int l,r,x,id;node(int a=0,int b=0,int c=0,int d=0){l=a,r=b,x=c,id=d;}};
int operator<(node a,node b){return a.l<b.l;}
set<node>s;
IT split(int pos)
{
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos) return it;
--it;
int L=it->l,R=it->r,X=it->x,ID=it->id;
s.erase(it),s.insert(node(L,pos-1,X,ID));
return s.insert(node(pos,R,X,ID)).first;
}
void assign(int l,int r,int x,int id)
{
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;++itl,s.erase(prev(itl))) bit.add(itl->id,-1ll*((itl->r)-(itl->l)+1)*(itl->x));
s.insert(node(l,r,x,id));
bit.add(id,1ll*(r-l+1)*x);
}
int main()
{
n=read(),m=read(),Q=read();int i,j=1;
for(i=1;i<=n;++i) opt[i]={read(),read(),read()};
for(i=1;i<=Q;++i) q[i]={read(),read(),i};
sort(q+1,q+Q+1,[](query a,query b){return a.r<b.r;}),s.insert(node(1,m,0,0));
for(i=1;i<=n;++i)
{
assign(opt[i].l,opt[i].r,opt[i].v,i);
while(j<=Q&&q[j].r==i) ans[q[j].id]=bit.query(q[j].l,i),++j;
}
for(i=1;i<=Q;++i) write(ans[i]);
return Flush(),0;
}
E
先tarjan,然后在DAG上dp。(tarjan的scc的编号反序就是拓扑序)
具体的维护一下从\(1\)到每个scc的最短边,最长边和最大路径边权极差即可。
#include<bits/stdc++.h>
#define pi pair<int,int>
#define fi first
#define se second
#define pb push_back
using namespace std;
namespace IO
{
char ibuf[(1<<21)+1],*iS,*iT;
char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
}
using namespace IO;
int min(int a,int b){return a<b? a:b;}
int max(int a,int b){return a>b? a:b;}
const int N=200007,M=500007;
vector<pi>G[N],E[N];
struct edge{int u,v,w;}e[M];
struct node{int mn,mx,ans;node(int a=0,int b=0,int c=0){mn=a,mx=b,ans=c;}}f[N];
int n,m,Q,dfn[N],low[N],Time,stk[N],top,cnt,vis[N],bel[N],mx[N],mn[N];
node merge(node a,node b)
{
a.ans=max(max(max(a.ans,b.ans),a.mx-b.mn),b.mx-a.mn);
a.mx=max(a.mx,b.mx);
a.mn=min(a.mn,b.mn);
return a;
}
void tarjan(int u)
{
dfn[u]=low[u]=++Time,stk[++top]=u,vis[u]=1;
for(pi x:G[u])
{
int v=x.fi;
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
++cnt;
while(stk[top+1]^u) bel[stk[top]]=cnt,vis[stk[top--]]=0;
}
}
int main()
{
n=read(),m=read(),Q=read(),memset(mn,0x3f,sizeof mn);
for(int i=1,u,v,w;i<=m;++i) u=read(),v=read(),w=read(),e[i]=(edge){u,v,w},G[u].pb(pi(v,w));
tarjan(1);
for(int i=1;i<=n;++i) if(bel[i]) bel[i]=cnt+1-bel[i];
for(int i=1,id;i<=m;++i)
if(bel[e[i].u]&&bel[e[i].v])
if(bel[e[i].u]==bel[e[i].v]) id=bel[e[i].u],mn[id]=min(mn[id],e[i].w),mx[id]=max(mx[id],e[i].w);
else E[bel[e[i].v]].pb(pi(bel[e[i].u],e[i].w));
for(int u=1;u<=cnt;++u)
{
node s=f[u]=node(mn[u],mx[u],mx[u]-mn[u]);
for(pi x:E[u])
{
int v=x.fi,w=x.se;
node t=merge(s,merge(node(w,w,0),f[v]));
f[u]=node(min(f[u].mn,t.mn),max(f[u].mx,t.mx),max(f[u].ans,t.ans));
}
}
for(int u;Q;--Q)
{
u=read();
if(!bel[u]||f[bel[u]].ans<0) puts("-1");
else printf("%d\n",f[bel[u]].ans);
}
}
Comet OJ - Contest #14的更多相关文章
- Comet OJ - Contest #14 转转的数据结构题 珂朵莉树+树状数组
题目链接: 题意:有两个操作 操作1:给出n个操作,将区间为l到r的数字改为x 操作2:给出q个操作,输出进行了操作1中的第x到x+y-1操作后的结果 解法: 把询问离线,按照r从小到大排序 每次询问 ...
- Comet OJ - Contest #14题解
Contest14的本质:区间覆盖+Tarjan( A 把距离公式两边平方即可 注意要long long code #include <algorithm> #include <io ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
- Comet OJ - Contest #8
Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...
- Comet OJ - Contest #13-C2
Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
随机推荐
- java文件上传下载解决方案
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...
- BZOJ 1095: [ZJOI2007]Hide 捉迷藏 动态点分治+堆
写了7k多,可以说是一己之力切掉了这道毒瘤题~ 开 $3$ 种堆,分别维护每个子树最大深度,以及每个节点在点分树中对父亲的贡献,和全局的最优解. 由于需要支持堆的删除,所以写起来特别恶心+麻烦. 细节 ...
- [LibreOJ 3119]【CTS2019】随机立方体【计数】【容斥】
Description Solution 记\(N=min(n,m,l)\) 首先考虑容斥,记\(f(i)\)为至少有i个位置是极大的,显然极大的位置数上界是N. 那么显然\(Ans=\sum\lim ...
- python之timeit模块
timeit模块: timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入 ...
- 我不熟悉的list
其实在日常中,链表的题目做的比较多,但是使用STL自带链表的还是比较少,所以里面的一些API不大熟悉.这边也简要介绍一些. 基本的一些API 先列举的这些和上面几篇用法几乎一样,所以不再累述. 赋值相 ...
- 使用Hive-JDBC遇到的一些问题解决
使用Hive-JDBC遇到的一些问题解决(转) 标签(空格分隔): Hive 1,java.lang.NoClassDefFoundError: org/apache/hive/service/cli ...
- sqli-labs(45)
基于报错的password处的')闭合注入 就是没有报错信息 payload和43关一样的构造
- BootStrap之X-editable插件使用
项目背景 刚加入公司的新项目,主要在做开发工作.由于是新手,本周的工作是配合另外一个同事写前台页面.前台框架是Bootstrap,本文主要介绍一下项目需求的一个功能——表格行内编辑事件. 使用X-ed ...
- webdriver驱动火狐浏览器报错:Unable to find a matching set of capabilities
raise exception_class(message, screen, stacktrace)selenium.common.exceptions.SessionNotCreatedExcept ...
- gulp自动化构建工具安装使用(1)
我用的是windows,所以以下操作针对于windows用户,其他系统有不一样的地方请自行查阅资料更正. 好了,废话少说,反正也就是随手捣腾.下雨了,天晴了,我们开始搞gulp了 安装:gulp是个构 ...