A. Square Function

留坑。

B. Guess by Remainder

询问$lcm(1,2,3,...,n)-1$即可一步猜出数。

计算$lcm$采用分治FFT即可,时间复杂度$O(n\log^2n)$。

C. Subtract if Greater!

对于每个修改操作,$[1,x]$的数无需修改,$[x+1,2x]$的数会减小至少一半,暴力修改即可,$[2x+1,inf]$的数减小之后排名不变,故可以在平衡树上打标记实现。

时间复杂度$O(n\log^2n+m\log n)$。

#include<cstdio>
#include<algorithm>
const int N=100010,inf=~0U>>1;
int n,m,i,op,k,a[N],val[N],tag[N],size[N],son[N][2],f[N],tot,root;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add1(int x,int p){
if(!x)return;
val[x]+=p;
tag[x]+=p;
}
inline void pb(int x){
if(tag[x]){
add1(son[x][0],tag[x]);
add1(son[x][1],tag[x]);
tag[x]=0;
}
}
inline void up(int x){
size[x]=1;
if(son[x][0])size[x]+=size[son[x][0]];
if(son[x][1])size[x]+=size[son[x][1]];
}
inline void rotate(int x){
int y=f[x],w=son[y][1]==x;
son[y][w]=son[x][w^1];
if(son[x][w^1])f[son[x][w^1]]=y;
if(f[y]){
int z=f[y];
if(son[z][0]==y)son[z][0]=x;
if(son[z][1]==y)son[z][1]=x;
}
f[x]=f[y];son[x][w^1]=y;f[y]=x;up(y);
}
inline void splay(int x,int w){
int s=1,i=x,y;a[1]=x;
while(f[i])a[++s]=i=f[i];
while(s)pb(a[s--]);
while(f[x]!=w){
y=f[x];
if(f[y]!=w){if((son[f[y]][0]==y)^(son[y][0]==x))rotate(x);else rotate(y);}
rotate(x);
}
if(!w)root=x;
up(x);
}
int build(int l,int r,int fa){
int x=++tot,mid=(l+r)>>1;
f[x]=fa;val[x]=a[mid];
if(l<mid)son[x][0]=build(l,mid-1,x);
if(r>mid)son[x][1]=build(mid+1,r,x);
up(x);
return x;
}
inline void ask(int k){
int x=root,t;
while(x){
pb(x);
if(val[x]>k)t=x,x=son[x][0];else x=son[x][1];
}
splay(t,0);
}
void ins(int&x,int y,int fa){
if(!x){
x=y;
f[y]=fa;
return;
}
pb(x);
size[x]++;
if(val[y]<val[x])ins(son[x][0],y,x);else ins(son[x][1],y,x);
}
inline void change(int k){
while(1){
ask(k);
int x=root;
if(val[x]<=k*2){
int y=son[x][1];
while(son[y][0])y=son[y][0];
splay(y,x);
son[y][0]=son[x][0];
f[y]=0;
f[son[x][0]]=y;
up(root=y);
val[x]-=k;
tag[x]=0;
son[x][0]=son[x][1]=0;
size[x]=1;
ins(root,x,0);
splay(x,0);
}else{
val[x]-=k;
add1(son[x][1],-k);
while(son[x][1])x=son[x][1];
val[x]=inf;
splay(x,0);
return;
}
}
}
inline int kth(int k){
int x=root,tmp;
while(1){
pb(x);
tmp=size[son[x][0]]+1;
if(k==tmp){
splay(x,0);
return val[x];
}
if(k<tmp)x=son[x][0];else k-=tmp,x=son[x][1];
}
}
int main(){
read(n),read(m);
for(i=1;i<=n;i++)read(a[i]);
a[++n]=0;
a[++n]=inf;
std::sort(a+1,a+n+1);
root=build(1,n,0);
while(m--){
read(op),read(k);
if(op==2)change(k);else printf("%d\n",kth(k+1));
}
return 0;
}

  

D. Eastern Subregional

留坑。

E. K-transform

DP显然,快速幂+FFT优化即可。时间复杂度$O(k\log k\log m)$。

F. Suffix Array for Thue-Morse

留坑。

G. XOR Tree

求出路径上偶数的集合然后分类讨论即可。

#include <bits/stdc++.h>
using namespace std ; typedef long long LL ; const int MAXN = 100005 ;
const int MAXE = 200005 ; struct Edge {
int v , n ;
Edge () {}
Edge ( int v , int n ) : v ( v ) , n ( n ) {}
} ; Edge E[MAXE] ;
int H[MAXN] , cntE ;
int dep[MAXN] ;
int top[MAXN] ;
int siz[MAXN] ;
int son[MAXN] ;
int pre[MAXN] ;
int pos[MAXN] ;
LL val[MAXN] ;
LL sum[MAXN] ;
int precol[MAXN] ;
int even[MAXN] ;
int tree_idx ;
int n , q ;
int eu[MAXN] , ev[MAXN] , ec[MAXN] ;
vector < int > G ;
LL all ; void init () {
cntE = 0 ;
tree_idx = 0 ;
memset ( H , -1 , sizeof H ) ;
memset ( val , 0 , sizeof val ) ;
memset ( sum , 0 , sizeof sum ) ;
memset ( even , 0 , sizeof even ) ;
} void addedge ( int u , int v ) {
E[cntE] = Edge ( v , H[u] ) ;
H[u] = cntE ++ ;
} void dfs ( int u ) {
son[u] = 0 ;
siz[u] = 1 ;
for ( int i = H[u] ; ~i ; i = E[i].n ) {
int v = E[i].v ;
if ( v == pre[u] ) continue ;
dep[v] = dep[u] + 1 ;
pre[v] = u ;
dfs ( v ) ;
siz[u] += siz[v] ;
if ( siz[son[u]] < siz[v] ) son[u] = v ;
}
} void rebuild ( int u , int top_element ) {
top[u] = top_element ;
pos[u] = ++ tree_idx ;
if ( son[u] ) rebuild ( son[u] , top_element ) ;
for ( int i = H[u] ; ~i ; i = E[i].n ) {
int v = E[i].v ;
if ( v == pre[u] || v == son[u] ) continue ;
rebuild ( v , v ) ;
}
} void dfs2 ( int u , int it ) {
precol[u] = it ;
for ( int i = H[u] ; ~i ; i = E[i].n ) {
int v = E[i].v ;
if ( v == pre[u] ) continue ;
dfs2 ( v , val[u] % 2 ? it : u ) ;
}
} void geteven ( int u , int lca ) {
//printf("geteven %d %d\n",u,lca);
while ( dep[u] > dep[lca] ) {
//printf(" %d %d %d\n",u,val[u],precol[u]);
if ( val[u] % 2 == 0 ) {
G.push_back ( val[u] ) ;
}
u = precol[u] ;
}
} void deal ( int u , int v ) {
LL tot = 0 , num = 0 ;
int x = u , y = v ;
//return;
while ( top[u] != top[v] ) {
if ( dep[top[u]] < dep[top[v]] ) swap ( u , v ) ;
num += even[pos[u]] - even[pos[top[u]] - 1] ;
tot += sum[pos[u]] - sum[pos[top[u]] - 1] ;
u = pre[top[u]] ;
}
//return;
if ( dep[u] > dep[v] ) swap ( u , v ) ;
num += even[pos[v]] - even[pos[u]] ;
tot += sum[pos[v]] - sum[pos[u]] ;
if ( num == 0 ) {
printf ( "1\n" ) ;
return ;
}
if ( num >= 3 ) {
printf ( "2\n" ) ;
return ;
}
G.clear () ;
geteven ( x , u ) ;
geteven ( y , u ) ;
int dis = dep[x] + dep[y] - 2 * dep[u] ;
sort ( G.begin () , G.end () ) ;
dis -= ( int ) G.size () ;
int out = ( all - tot ) & 1 ; // printf("->%d\n",G.size());
//return; if ( num == 1 ) {
if ( G[0] >= dis ) {
printf ( "1\n" ) ;
return ;
} else {
printf ( "2\n" ) ;
return ;
}
}
//return;
if ( num == 2 ) {
G[0] -= dis - 1 ;
if ( G[0] <= 1 ) {
printf ( "2\n" ) ;
return ;
} else {
G[0] %= 2 ;
if ( ( G[0] == 0 ) ^ ( out == 0 ) ) printf ( "2\n" ) ;
else printf ( "1\n" ) ;
return ;
}
}
} void solve () {
init () ;
all = 0 ;
for ( int i = 1 ; i < n ; ++ i ) {
scanf ( "%d%d%d" , &eu[i] , &ev[i] , &ec[i] ) ;
addedge ( eu[i] , ev[i] ) ;
addedge ( ev[i] , eu[i] ) ;
all += ec[i] ;
}
dfs ( 1 ) ;
rebuild ( 1 , 1 ) ;
for ( int i = 1 ; i < n ; ++ i ) {
if ( dep[eu[i]] > dep[ev[i]] ) {
sum[pos[eu[i]]] = ec[i] ;
val[eu[i]] = ec[i] ;
even[pos[eu[i]]] = ec[i] % 2 == 0 ;
} else {
sum[pos[ev[i]]] = ec[i] ;
val[ev[i]] = ec[i] ;
even[pos[ev[i]]] = ec[i] % 2 == 0 ;
}
}
dfs2 ( 1 , 0 ) ;
for ( int i = 2 ; i <= n ; ++ i ) {
sum[i] += sum[i - 1] ;
even[i] += even[i - 1] ;
}
while ( q -- ) {
int u , v ;
scanf ( "%d%d" , &u , &v ) ;
deal ( u , v ) ;
}
} int main () {
while ( ~scanf ( "%d%d" , &n , &q ) ) solve () ;
return 0 ;
}

  

H. Fence

留坑。

I. Friends and Berries - 2

首先求出凸包,然后分治求出每个点的最远点,检查一下直径是否合法,是的话那么所有直径都是答案。时间复杂度$O(n\log n)$。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int>PI;
const int N=500010;
int n,i,f[N];ll d[N];
map<PI,int>idx;
set<PI>ans;
struct P{
int x,y;
P(){x=y=0;}
P(int _x,int _y){x=_x,y=_y;}
void input(){scanf("%d%d",&x,&y);}
bool operator<(const P&p)const{
if(x!=p.x)return x<p.x;
return y<p.y;
}
}a[N],b[N];
inline ll dis(const P&a,const P&b){
return 1LL*(a.x-b.x)*(a.x-b.x)+1LL*(a.y-b.y)*(a.y-b.y);
}
inline ll cal(int x,int y){
ll t=dis(b[x],b[y]);
if(y<x||y>=x+n)return -t;
return t;
}
inline ll vect(P p,P p1,P p2){
return 1LL*(p1.x-p.x)*(p2.y-p.y)-1LL*(p1.y-p.y)*(p2.x-p.x);
}
int convexhull(P*p,int n,P*q){
int i,k,m;
sort(p,p+n);
m=0;
for(i=0;i<n;q[m++]=p[i++])while(m>1&&vect(q[m-2],q[m-1],p[i])<0)m--;
k=m;
for(i=n-2;i>=0;q[m++]=p[i--])while(m>k&&vect(q[m-2],q[m-1],p[i])<0)m--;
return --m;
}
void solve(int l,int r,int dl,int dr){
int m=(l+r)>>1;
f[m]=dl;
d[m]=cal(m,dl);
for(int i=dl+1;i<=dr;i++){
ll t=cal(m,i);
if(t>d[m])d[m]=t,f[m]=i;
}
if(l<m)solve(l,m-1,dl,f[m]);
if(r>m)solve(m+1,r,f[m],dr);
}
inline bool check(P A,P B){
for(int i=0;i<n;i++)if(dis(A,B)<dis(A,b[i])+dis(B,b[i]))return 0;
return 1;
}
inline void newans(int x,int y){
if(x==y)return;
if(x>y)swap(x,y);
ans.insert(PI(x,y));
}
int main(){
scanf("%d",&n);
for(i=0;i<n;i++){
a[i].input();
idx[PI(a[i].x,a[i].y)]=i+1;
}
n=convexhull(a,n,b);
if(n==2){
for(i=0;i<n;i++)printf("%d ",idx[PI(b[i].x,b[i].y)]);
return 0;
}
for(i=0;i<n;i++)b[i+n]=b[i];
solve(0,n-1,0,n*2-1);
int x=0;
for(i=1;i<n;i++)if(d[i]>d[x])x=i;
for(i=0;i<n;i++)f[i]%=n;
if(!check(b[x],b[f[x]]))return puts("0"),0;
for(i=0;i<n;i++)if(d[i]==d[x]){
//if(!check(b[i],b[f[i]))while(1);
newans(i,f[i]);
}
//for(i=0;i<n;i++)printf("%d %d\n",b[i].x,b[i].y);
//puts("");
printf("%d\n",ans.size());
for(set<PI>::iterator it=ans.begin();it!=ans.end();it++){
//printf("%d %d\n",it->first,it->second);
printf("%d %d\n",idx[PI(b[it->first].x,b[it->first].y)],
idx[PI(b[it->second].x,b[it->second].y)]);
}
}

  

J. Oleg and Cola

超图上的最短路,dijkstra+染色即可。时间复杂度$O(m\log m)$。

#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
typedef pair<ll,P>PI;
const int N=200010;
int n,m,i,ce,id[N],st[N][2],en[N][2];
int cnt,fin[N*2];
P pos;ll ans;
bool v[N][2];
ll d[N][2];
P pre[N][2];
priority_queue<PI,vector<PI>,greater<PI> >q;
struct E{
int u,v,len,light;
E(){}
E(int _u,int _v,int _len,int _light){u=_u,v=_v,len=_len,light=_light;}
}e[N];
inline bool cmp(int x,int y){
if(e[x].u!=e[y].u)return e[x].u<e[y].u;
return e[x].light<e[y].light;
}
inline void ext(int x,int y,ll z,P p){
if(v[x][y])return;
z+=e[x].len;
v[x][y]=1;
d[x][y]=z;
pre[x][y]=p;
q.push(PI(z,P(x,y)));
}
int main(){
scanf("%d%d",&n,&m);
for(ce=i=1;i<=m;i++){
int u,v,len,light;
scanf("%d%d%d%d",&u,&v,&len,&light);
e[++ce]=E(u,v,len,light);
e[++ce]=E(v,u,len,light);
}
for(i=2;i<=ce;i++)id[i]=i;
sort(id+2,id+ce+1,cmp);
for(i=1;i<=n;i++)st[i][0]=1;
for(i=2;i<=ce;i++)en[e[id[i]].u][0]=i;
for(i=ce;i>1;i--)st[e[id[i]].u][0]=i;
for(i=1;i<=n;i++)st[i][1]=st[i][0],en[i][1]=en[i][0];
for(i=2;i<=ce;i++)if(e[i].u==1)ext(i,0,0,P(0,0));
while(!q.empty()){
PI t=q.top();q.pop();
int x=t.second.first,y=t.second.second;
ll z=t.first;
int o=e[x].v;
while(st[o][y]<=en[o][y]){
int i=id[en[o][y]];
if(e[i].light<e[x].light)break;
ext(i,y,z,P(x,y));
en[o][y]--;
}
if(o==2&&y==0){
while(st[o][1]<=en[o][1]){
int i=id[en[o][1]];
if(e[i].light<e[x].light)break;
ext(i,1,z,P(x,y));
en[o][1]--;
}
}
}
ans=1LL<<60;
for(i=2;i<=ce;i++)if(e[i].v==1&&v[i][1]){
if(d[i][1]<ans){
ans=d[i][1];
pos=P(i,1);
}
}
printf("%lld\n",ans);
while(pos.first){
fin[++cnt]=pos.first/2;
pos=pre[pos.first][pos.second];
}
while(cnt)printf("%d ",fin[cnt--]);
}

  

K. Process with Constant Sum

留坑。

Petrozavodsk Summer-2016. Ural FU Dandelion Contest的更多相关文章

  1. 2016 Sichuan Province Programming Contest

    2016 Sichuan Province Programming Contest 代码 2016 Sichuan Province Programming Contest A. Nearest Ne ...

  2. 2016 Hunan Province Programming Contest

    2016 Hunan Province Programming Contest A. 2016 题意 \(1 \le a \le n, 1 \le b \le m\) ,其中\(1 \le n,m \ ...

  3. 2016 China Collegiate Programming Contest Final

    2016 China Collegiate Programming Contest Final Table of Contents 2016 China Collegiate Programming ...

  4. 2016 NEERC, Moscow Subregional Contest K. Knights of the Old Republic(Kruskal思想)

    2016 NEERC, Moscow Subregional Contest K. Knights of the Old Republic 题意:有一张图,第i个点被占领需要ai个兵,而每个兵传送至该 ...

  5. Petrozavodsk Winter Training Camp 2016: Moscow SU Trinity Contest

    题目列表 A.ABBA E.Elvis Presley G. Biological Software Utilities J. Burnished Security Updates A.ABBA 题意 ...

  6. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) E

    链接:http://codeforces.com/gym/101116 学弟写的,以后再补 #include <iostream> #include <algorithm> # ...

  7. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) J

    链接:http://codeforces.com/gym/101116 题意:给出n个点,要求一个矩形框将(n/2)+1个点框住,要面积最小 解法:先根据x轴选出i->j之间的点,中间的点(包括 ...

  8. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) I

    链接:http://codeforces.com/gym/101116 题意:选六个数,必须出现次数最多,且数字最小,如果出现7优先加入7 解法:排序,出现7优先加入7,最后再将6个数排序 #incl ...

  9. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) B

    链接:http://codeforces.com/gym/101116 学弟做的,以后再补 #include <iostream> #include <stdio.h> #in ...

随机推荐

  1. 消息框MessageBox+遍历控件

    消息对话框:主要用来显示信息,也可以警告.用户确认取消等. MessageBox.Show("展示内容","标题",MessageBoxButtons.按钮种类 ...

  2. Kubernetes之RBAC

    API Server的授权管理 API Server 内部通过用户认证后,然后进入授权流程.对合法用户进行授权并且随后在用户访问时进行鉴权,是权限管理的重要环节.API Server 目前支持一下几种 ...

  3. CMDB服务器管理系统【s5day89】:部分数据表结构-资产入库思路

    1.用django的app作为统一调用库的好处 1.创建repository app截图如下: 2.好处如下: 1.app的本质就是一个文件夹 2.以后所有的app调用数据就只去repository调 ...

  4. Fiddler--AutoResponder

    AutoResponder支持创建规则,可以在响应请求时自动触发,常见例子是返回之前捕捉的响应,而不需要访问服务器. 通俗点讲,就是它能在不访问服务器的情况下,使发送的请求得到自己设置的响应. 下图是 ...

  5. Hadoop记录- Yarn scheduler队列采集

    #!/bin/sh ip=10.116.100.11 port=8088 export HADOOP_HOME=/app/hadoop/bin rmstate1=$($HADOOP_HOME/yarn ...

  6. C#设计模式(17)——观察者模式

    1.观察者模式介绍 观察者模式又叫发布-订阅模式,它定义了对象间的一种一对多关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并被自动更新.观察者模式就四个角色:抽象主题,具体主题,抽象 ...

  7. 适配器模式-Adapter(Java实现)

    适配器模式-Adapter 是作为两个不兼容的接口之间的桥梁. 本篇文章的代码github地址: https://github.com/GoldArowana/design-patterns/tree ...

  8. 导出CSV 换行问题。

    程序方面: 1.Windows 中的换行符"\r\n" 2.Unix/Linux 平台换行符是 "\n". 3.MessageBox.Show() 的换行符为 ...

  9. QMainWindow-状态栏

    self.status_bar = self.statusBar()          # 显示状态栏 self.setStatusTip('这是一个窗口')       #鼠标在指定控件上时,状态栏 ...

  10. centos7安装notepadqq

    这是在centos7 上发表的第一篇博文 对linux系统陌生,折腾了一天,安装好了搜狗输入法.相关文章也不少,但照着一步一步来,都没有成功.最后照着这篇弄成了: ****** 安装notepadd+ ...