2016 ACM/ICPC Asia Regional Dalian Online

自己还是太菜,补题离不开题解。。。

但还是留个博客,万一以后忘了。。。

1001 Different Circle Permutation

Polya定理,第一次遇见,学习了一下。不旋转的时候可以得到 f[i]=f[i-1]+f[i-2] 斐波那契数列,旋转后就可以通过burnside引理求解,循环节为 gcd(i,n)。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL mod=1e9+7;
 5 LL pow_mod(LL a,LL n){
 6     LL res=1,t=a%mod;
 7     while(n){
 8         if(n&1) res=(res*t)%mod;
 9         t=(t*t)%mod;
10         n/=2;
11     }
12     return res;
13 }
14 struct Mat{
15     LL a[2][2];
16     void init(){
17         a[0][0]=1;
18         a[1][0]=a[0][1]=1;
19         a[1][1]=0;
20     }
21 };
22 Mat operator *(Mat a,Mat b){
23     Mat c;
24     for(LL i=0;i<2;i++)
25     for(LL j=0;j<2;j++){
26         c.a[i][j]=0;
27         for(LL k=0;k<2;k++)
28             c.a[i][j]+=a.a[i][k]*b.a[k][j];
29             c.a[i][j]%=mod;
30     }
31     return c;
32 }
33 Mat operator ^(Mat p,LL k){
34     Mat ans; ans.init();
35     while(k){
36         if(k&1)
37             ans=ans*p;
38         k/=2;
39         p=p*p;
40     }
41     return ans;
42 }
43 LL fun(LL x){
44     Mat a; a.init();
45     Mat b;
46     b.a[0][0]=1;
47     b.a[0][1]=0;
48     b.a[1][0]=2;
49     b.a[1][1]=0;
50     a=a^(x-2);
51     if(x>1) b=a*b;
52     return b.a[0][0];
53 }
54 LL n;
55 LL euler(LL n){
56     LL ans=n;
57     for(LL i=2;i*i<=n;i++){
58         if(n%i==0){
59             ans-=ans/i;
60             while(n%i==0) n/=i;
61         }
62     }
63     if(n>1) ans-=ans/n;
64     return ans;
65 }
66 int main(){
67     while(~scanf("%lld",&n)){
68         if(n==1){
69             printf("%lld\n",2);
70             continue;
71         }
72         LL ans=0;
73         for(LL i=1;i*i<=n;i++){
74             if(n%i==0){
75                 ans+=fun(i)*euler(n/i)%mod;
76                 if(n/i!=i) ans+=fun(n/i)*euler(i)%mod;
77                 ans%=mod;
78             }
79         }
80         ans=ans*pow_mod(n,mod-2)%mod;
81         printf("%lld\n",ans);
82     }
83 
84     return 0;
85 }
Psong

1002 Different GCD Subarray Query

查询区间内不同gcd个数,区间gcd可以ST表打出,并提前二分处理出每个点向右gcd下降的地方。查询作为点对,以右端点大小排序,然后用树状数组处理。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 int n,q;
  5 int k[100005];
  6 
  7 int kk;
  8 struct node{
  9     int l,r,pos;
 10 } a[100005];
 11 bool cmp(node x,node y){
 12     return x.r<y.r;
 13 }
 14 
 15 int gcd(int x,int y){
 16     return y==0?x:gcd(y,x%y);
 17 }
 18 
 19 int lg[100005];
 20 int dp[100005][35];
 21 int RMQ_ST(int n){
 22     for(int i=1;i<=n;i++) lg[i]=(int)( log(1.0*i)/log(2.0) );
 23     for(int i=1;i<=n;i++) dp[i][0]=k[i];
 24     for(int j=1;(1<<j)<=n;j++){
 25         for(int i=1;i<=n-(1<<j)+1;i++){
 26             dp[i][j]=gcd( dp[i][j-1],dp[i+(1<<(j-1))][j-1] );
 27         }
 28     }
 29 }
 30 int find_gcd(int l,int r){
 31     int k=lg[r-l+1];
 32     return gcd(dp[l][k],dp[r-(1<<k)+1][k]);
 33 }
 34 
 35 int ans[100005];
 36 int c[100006];
 37 vector<int> vr[100005];
 38 
 39 int lowbit(int x){
 40     return x&(-x);
 41 }
 42 int add(int pos,int val){
 43     for(int i=pos;i<=n;i+=lowbit(i)){
 44         c[i]+=val;
 45     }
 46 }
 47 int sum(int pos){
 48     int res=0;
 49     for(int i=pos;i>0;i-=lowbit(i)){
 50         res+=c[i];
 51     }
 52     return res;
 53 }
 54 
 55 void init(){
 56     for(int i=1;i<=n;i++){
 57         vr[i].push_back(i);
 58         int tmp=k[i];
 59         int l=1,r=i;
 60         while(l<r){
 61             int L=l,R=r,flag=0;
 62             while(L<R){
 63                 int mid=(L+R+1)/2;
 64                 if(find_gcd(mid,i)<tmp) L=mid;
 65                 else if(find_gcd(l,i)<tmp) R=mid-1;
 66                 else { flag=1;break; }
 67             }
 68             if(!flag){
 69                 tmp=find_gcd(R,i);
 70                 vr[i].push_back(R);
 71             }
 72             else break;
 73             r=R;
 74         }
 75     }
 76 }
 77 int pos[1000006];
 78 void solve(){
 79     int R=0;
 80     for(int i=1;i<=q;i++){
 81         while(R<a[i].r){
 82             R++;
 83             for(int j=0;j<vr[R].size();j++){
 84                 int ll=vr[R][j];
 85                 int _gcd=find_gcd(ll,R);
 86                 if(pos[_gcd]==0) add(ll,1);
 87                 else if(pos[_gcd]<ll) add(ll,1),add(pos[_gcd],-1);
 88                 pos[_gcd]=max(pos[_gcd],ll);
 89             }
 90         }
 91         ans[a[i].pos]=sum(a[i].r)-sum(a[i].l-1);
 92     }
 93 }
 94 
 95 int main(){
 96     while(scanf("%d%d",&n,&q)!=EOF){
 97         for(int i=1;i<=n;i++) scanf("%d",&k[i]);
 98         RMQ_ST(n);
 99         init();
100         kk=sqrt(n);
101         for(int i=1;i<=q;i++){
102             scanf("%d%d",&a[i].l,&a[i].r);
103             a[i].pos=i;
104         }
105         sort(a+1,a+1+q,cmp);
106         memset(c,0,sizeof(c));
107         memset(pos,0,sizeof(pos));
108         //cout<<sum(1)<<endl;
109         solve();
110         for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
111     }
112 
113 
114     return 0;
115 }
116 /*
117 9 10
118 3 3 4 4 4 6 6 6 9
119 */
Psong

1003 Alice's Adventure in Wonderland

1004 Number of Connected Subgraph

1005 Seats

1006 Football Games

排序后判断前 i 个和不能少于 i*(i-1)/2 ,且总数为 n*(n-1)/2 即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int b[20005];
 5 int main(){
 6     int t;
 7     while(cin>>t){
 8         while(t--){
 9             cin>>n;
10             for(int i=1;i<=n;i++) cin>>b[i];
11             int sum=0,flag=0;
12             for(int i=1;i<=n;i++){
13                 sum+=b[i];
14                 if(sum<i*(i-1)) flag=1;
15             }
16             if(sum!=n*(n-1)) flag=1;
17             if(flag==0) cout<<'T'<<endl;
18             else cout<<'F'<<endl;
19         }
20     }
21 
22     return 0;
23 }
Psong

1007 Friends and Enemies

最多的情况为把所有人平均分成两组,然后内部互为敌人,外部互为朋友即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 long long n,m;
 4 int main(){
 5     while(cin>>n>>m){
 6         if(m>=(n-n/2)*(n/2)) cout<<"T"<<endl;
 7         else cout<<"F"<<endl;
 8     }
 9 
10     return 0;
11 }
Psong

1008 Function

查询区间最左边的一个数向右取模后的结果,每次取模下降至少为一半,所以ST表打出最小值,然后对每个询问依次二分出向右的第一个比当前值小的位置。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int a[100005];
 5 int dp[100005][35];
 6 int lg[100005];
 7 void RMQ_ST(int n){
 8     for(int i=1;i<=n;i++) lg[i]=(int)(log(1.0*i)/log(2.0));
 9     for(int i=1;i<=n;i++) dp[i][0]=a[i];
10     for(int j=1;(1<<j)<=n;j++){
11         for(int i=1;i<=n-(1<<j)+1;i++){
12             dp[i][j]=min( dp[i][j-1],dp[i+(1<<(j-1))][j-1] );
13         }
14     }
15 }
16 int find_min(int l,int r){
17     int k=lg[r-l+1];
18     return min(dp[l][k],dp[r-(1<<k)+1][k]);
19 }
20 void solve(int l,int r){
21     int res=a[l];
22     int L=l+1,R=r;
23     while(l<r){
24         while(L<R){
25             int mid=(L+R)/2;
26             if(find_min(l+1,mid)<=res) R=mid;
27             else L=mid+1;
28         }
29         if(find_min(l+1,L)>res) L=R;
30         res%=a[L];
31         L++; R=r;
32         if(find_min(l+1,r)>res) break;
33     }
34     printf("%d\n",res);
35 }
36 int main(){
37     int t;
38     scanf("%d",&t);
39     while(t--){
40         scanf("%d",&n);
41         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
42         RMQ_ST(n);
43         scanf("%d",&m);
44         while(m--){
45             int l,r;
46             scanf("%d%d",&l,&r);
47             solve(l,r);
48         }
49     }
50 
51     return 0;
52 }
53 /*
54 6
55 18 30 15 8 6 4
56 */
Psong

1009 Sparse Graph

补图最短路,用两个set维护还没有记录的点,和与当前点相连的点。

#include <bits/stdc++.h>
using namespace std;
vector<int> g[200005];
int dis[200005];
int n,m,s;
int u,v;
void bfs(){queue<int> q; q.push(s);set<int> s1,s2;for(int i=1;i<=n;i++)if(i!=s) s1.insert(i);while(!q.empty()){int u=q.front(); q.pop();for(int i=0;i<g[u].size();i++){int v=g[u][i];if(s1.find(v)!=s1.end()){s1.erase(v);s2.insert(v);}}set<int>::iterator it=s1.begin();for(;it!=s1.end();it++){dis[(*it)]=dis[u]+1;q.push(*it);}swap(s1,s2);s2.clear();}vector<int> ans;for(int i=1;i<=n;i++)if(i!=s) ans.push_back(dis[i]);for(int i=0;i<ans.size();i++){if(i==0) printf("%d",ans[i]);else printf(" %d",ans[i]);}printf("\n");
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(dis,-1,sizeof(dis));for(int i=1;i<=n;i++) g[i].clear();for(int i=1;i<=m;i++) {scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}scanf("%d",&s); dis[s]=0;bfs();}return 0;
}
/*
2
5 6
1 2
1 3
2 4
3 4
2 5
4 5
2
*/
Psong

1010 Weak Pair

离散化后dfs,用树状数组记录每个数出现个数,然后直接计数,当处理完一个点的时候要把这个这个值删除。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL n,k;
 5 LL root;
 6 LL a[100005];
 7 LL in[100005];
 8 vector<LL> g[100005];
 9 LL cnt;
10 LL c[500005];
11 LL lowbit(LL x){
12     return x&(-x);
13 }
14 void add(LL pos,LL val){
15     for(LL i=pos;i<=cnt;i+=lowbit(i)){
16         c[i]+=val;
17     }
18 }
19 LL sum(LL pos){
20     LL res=0;
21     for(LL i=pos;i>0;i-=lowbit(i)){
22         res+=c[i];
23     }
24     return res;
25 }
26 vector<LL> v;
27 LL getid(LL x){
28     return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
29 }
30 
31 LL ans;
32 void dfs(LL u){
33     LL id=getid(a[u]);
34     if(a[u]){
35         ans+=sum(getid(k/a[u]));
36         add(id,1);
37     }
38     else{
39         ans+=sum(cnt);
40         add(1,1);
41     }
42     for(LL i=0;i<g[u].size();i++){
43         dfs(g[u][i]);
44     }
45     if(a[u]) add(id,-1);
46     else add(1,-1);
47 }
48 int main(){
49     LL t;
50     scanf("%lld",&t);
51     while(t--){
52         v.clear(); v.push_back(0);
53         memset(c,0,sizeof(c));
54         memset(in,0,sizeof(in));
55         scanf("%lld%lld",&n,&k);
56         for(LL i=1;i<=n;i++){
57             g[i].clear();
58             scanf("%lld",&a[i]);
59             v.push_back(a[i]);
60             if(a[i]!=0) v.push_back(k/a[i]);
61         }
62         for(LL i=1;i<n;i++){
63             LL u,v;
64             scanf("%lld%lld",&u,&v);
65             g[u].push_back(v);
66             in[v]++;
67         }
68         sort(v.begin(),v.end());
69         v.erase(unique(v.begin(),v.end()),v.end());
70         cnt=v.size(); ans=0;
71         for(LL i=1;i<=n;i++){
72             if(in[i]==0) root=i;
73         }
74         dfs(root);
75         printf("%lld\n",ans);
76     }
77 
78 
79     return 0;
80 }
Psong

 

转载于:https://www.cnblogs.com/N-Psong/p/7141906.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tornado学习笔记day07-同步与异步

同步 概念 同步就是按部就班的依次执行我们的代码 进阶 但是有些情况我们有一些比较耗时的从操作,比如去别的地方拿点资源,去其他网站请求数据,去访问数据库,上传文件等等,所以这里面优点瑕疵,有小编一一道来 比如这样 本模块的功能:<同步异步demo># 这个就相等于一个…

关键字: on

关键字: on 数据库在通过连接两张或多张表来返回记录时&#xff0c;都会生成一张中间的临时表&#xff0c;然后再将这张临时表返回给用户。 在使用left jion时&#xff0c;on和where条件的区别如下&#xff1a; 1、 on条件是在生成临时表时使用的条件&#xff0c;它不管on中的条…

天融信安全接入客户端_天融信提示您警惕物联网设备Ripple20漏洞风险

近日&#xff0c;天融信阿尔法实验室在JSOF实验室发布的由Treck公司开发的TCP/IP软件库中获取到一系列0day漏洞。JSOF实验室发布的这批漏洞共计19个&#xff0c;被JSOF研究人员称为"Ripple20"。受此软件库影响的产品数量估计超过数亿&#xff0c;其中包括智能家居设备…

Service-Oriented Architecture,SOA(转)

http://blog.csdn.net/WOOSHN/article/details/8036910 介绍&#xff1a; IT体系结构已非常成熟&#xff0c;它是一种成功处理典型IT问题的方法。体系结构中一个受到很大重视且相对较新的分支是面向服务的体系结构(SOA)。SOA经常被吹捧为企业用于解决应用程序灵活性和高维护成本…

tornado学习笔记day08-tornado中的异步

概述 应为epoll主要用来解决网络的并发问题,所以tornado中的异步也是主要体现在网络的IO异步上,即异步web请求 tornado.httpclient.AsyncHTTPClient tornado提供异步web请求客户端,可以用来进行异步web请求, 这个客户端和服务端是相对来说的,当tornado的Handler去其他位置去…

GreenSock (TweenMax) 动画案例(二)

实现效果 动画分解 1.灯光闪烁2.文字出现3.水流4.心电图 知识点 1.AI(可尽情骚扰UI欧巴)2.SVG(了解基本的知识点)3.TweenMax(GreenSock)4.CSS animation 写在前面 写过第一篇文章后GreenSock (TweenMax) 动画案例(一)再回头看发现代码太多&#xff0c;根本没耐心去看完。所以每…

vue 用key拿对象value_利用 WeakMap 对 Vue 新建数组中的对象赋予 :key

需求在 Vue 中&#xff0c;对组件进行循环都需要加入key以便“就地复用”&#xff0c;可是在某些情况下&#xff0c;我们需要新建多个对象&#xff0c;而这些对象不是从后端获取到的&#xff0c;而是前端生成的&#xff0c;没有唯一值&#xff0c;且 Vue 目前版本只允许字符串&…

无限轮播图片的实现原理

无限轮播图相信是很多开发人员常用的一个功能&#xff0c;这里总结一下常用的两种方式的实现原理 一、使用UIScrollview实现无限轮播用UIScrollView实现&#xff0c;在scrollView上添加3个UIImageView&#xff0c;分别用来显示上一张图片&#xff0c;当前显示的图片&#xff0c…

开启 JM 的 trace 功能

[JM代码] 开启 JM 的 trace 功能本帖最后由 firstime 于 2009-6-15 11:16 AM 编辑 城里汉子说过&#xff1a; trace文件对分析码流结构很有效。我说的是trace文件&#xff0c;不是一步一步跟踪&#xff0c;就是编解码同时生成的 trace_enc.txt 这个文件&#xff0c;里面对每个比…

kafka入门介绍(转载)

Kafka作为一个分布式的流平台&#xff0c;这到底意味着什么&#xff1f; 我们认为&#xff0c;一个流处理平台具有三个关键能力&#xff1a; 发布和订阅消息&#xff08;流&#xff09;&#xff0c;在这方面&#xff0c;它类似于一个消息队列或企业消息系统。 以容错的方式存储…

Cmd Markdown 编辑阅读器

欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想&#xff0c;整理笔记、知识&#xff0c;并将其中承载的价值传播给他人&#xff0c;Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown&…

关于在smarty中实现省市区三级联动

刚开始接触php&#xff0c;&#xff0c;其实对于一些比较深入的东西还不是很了解&#xff0c;就像是这次的省市区联动&#xff0c;都是用三张表为基础编码的&#xff0c;原谅我的无知&#xff0c;谢谢。 接下来就是编码部分了&#xff1a; <?php require(./smarty/Smarty.c…

Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)

相关博文&#xff1a; Ubuntu 简单安装和配置 GitLabUbuntu 简单安装 DockerUbuntu Docker 简单安装 GitLabUbuntu Docker 安装和配置 GitLab CI 持续集成服务器版本 Ubuntu 16.04 LTS。 经过上面四篇博文中的相关安装和配置&#xff0c;我们主要完成了两个容器的创建和运行&am…

X264学习笔记(1)

X264学习笔记&#xff08;1&#xff09; X264编码流程 参数的初始化 1.opt&#xff0c;param根据输入的参数和标准的规定&#xff0c;进行初始化设置。 Opt的说明如下&#xff1a; Opt->hin用于给出读入的yuv文件的指针地址 Opt->hout给出了输出的文件的指针地址 Opt->…

python 数字转化excel行列_Python实现excel的列名称转数字、26进制(A-Z)与10进制互相转换...

Python实现excel的列名称转数字、26进制(A-Z)与10进制互相转换sequence list( map( lambda x: chr( x ), range( ord( A ), ord( Z ) 1 ) ) )##-----字母转数字(python实现 1-26A-Z, then AA-AZ)def ten2TwentySix(num):L []numnum-1; #实现从1对应Aif num > 25:while Tr…

错误提示:'……' is not assignable to Android.app.Activity Manifest XML

1 问题描述&#xff1a; 针对这段代码&#xff1a; <activity android:name".fragament.fragment_bulter" /> <activity android:name".fragament.fragment_girl" /> <activity android:name".fragament.fragment_user" />…

关于Lambda和匿名内部类

先上代码&#xff1a; //gcache(f)public <T,R> Function<T,R> cache(Function<T,R> f){final Map<T,R> cachenew HashMap<>();Function<T,R> gt->{if(cache.containsKey(t)){System.out.println("cached t:"t);return cache…

H26L encoder.cfg参数分析

H264 encoder.cfg参数分析 收藏 (1) 文件操作参数:#Files InputFile "silent.yuv" #输入序列,YUV 4:2:0 StartFrame 0 # 从视频流的第几帧开始编码 FramesToBeEncoded 30 #编码图象帧数,指明了除去 B帧后将要被编码的帧数(应该再实验一下&#x…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、关键步骤 1.删除旧的ckeditor静态文件 所在目录&#xff1a;项目目录下的static文件夹下的ckditor文件夹 rm ckeditor -rf 原因&#xff1a;在安装ckeditor后需要执行collectstatic命令&#xff0c;这个过程中的查找静态文件会去…

python中最难的是什么_python什么的最难了

学的人很少的,如果你没有学过编程,建议学c语言.因为python中文资料很少的.你可以先了解一下phthonpython的历史python的创始人为guido van rossum。1989年圣诞节期间&#xff0c;在阿姆斯特丹&#xff0c;guido为了打发圣诞节的无趣&#xff0c;决心开发一个新的脚本解释程序&a…