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,一经查实,立即删除!

相关文章

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

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

GreenSock (TweenMax) 动画案例(二)

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

无限轮播图片的实现原理

无限轮播图相信是很多开发人员常用的一个功能&#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&…

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…

django-ckeditor表情包修改

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

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.2 如何读入文本输入

2.2.2 如何读入文本输入 最简单的处理任意文本的方式就是使用在卷Ⅰ中我们广泛使用的Scanner类。我们可以从任何输入流中构建Scanner对象。或者&#xff0c;我们也可以将短小的文本文件像下面这样读入到一个字符串中&#xff1a; 在早期的Java版本中&#xff0c;处理文本输入的…

amap不同样式marker点_想出一手漂亮的图,CAD打印样式表你必须会!

好课推荐&#xff1a;1.CAD2014&#xff1a;点击查看2.室内CAD&#xff1a;点击查看3.CAD2019&#xff1a;点击查看4.CAD2018&#xff1a;点击查看5.【bim】revit&#xff1a;点击查看6.室内手绘&#xff1a;点击查看7.CAD三维&#xff1a;点击查看8.全屋定制&#xff1a;点击查…

研究人员发现Office Word 0Day攻击 这个漏洞绕过了word宏安全设置 绿盟科技、McAfee及FireEye发出警告...

这次的0Day漏洞确实很厉害&#xff0c;以往攻击者诱使用户点击Word文档&#xff0c;由于其中包含了恶意脚本&#xff0c;大多数需要用户启用了宏。但这次的漏洞不是&#xff0c;受害者无需启用宏&#xff0c;也会中招&#xff0c;而且漏洞覆盖Windows所有版本&#xff08;包括W…

数据中心传输需求成以太网市场巨大推动力

近日&#xff0c;市场研究机构Infonetics作出评估称&#xff0c;数据中心以太网市场将迎来全面发展的势头&#xff0c;其驱动力则在于当前数据中心以太网络交换接口由10Gbps产品向25Gbps乃至50Gbps标准的大规模升级。 根据对2014年第三季度的市场销售情况研究&#xff0c;该公司…

主打“云安全” 迅雷系帝恩思登陆新三板

ZD至顶网安全频道 06月14日 综合消息&#xff1a; 6月14日上午&#xff0c;帝恩思(837018)敲响了登陆新三板的钟声。作为帝恩思的重要股东&#xff0c;迅雷&#xff08;NASDAQ:XNET&#xff09;CEO邹胜龙与帝恩斯董事长王宇杰、总经理许渊培等人一同参加了这一仪式。 帝恩斯是一…

UESTC 1636 梦后楼台高锁,酒醒帘幕低垂

题意&#xff1a;求一条路径&#xff0c;使得这条边连接1到n&#xff0c;求边权值的最大值与最小值的差 题解&#xff1a;最小生成树&#xff0c;对边权排序&#xff0c;可以枚举边的最大和最小的值&#xff0c;判断能否使得1和n连通 #include <bits/stdc.h> #define ll …

WORD列表缩进的文本起始点

Figure 1 Figure 2 Figure 3 编号位置以刻度尺为起点0.74厘米&#xff08;2个字符间距&#xff09;&#xff0c;文本缩进以刻度尺为起点2.96厘米&#xff08;8个字符间距&#xff09; 以上两者相减得到的值正好特殊格式悬挂缩进的值2.22厘米 Figure 4 上图看到&#xff0c;文本…

无人车火了 百度是如何做到的?

ZD至顶网服务器频道 03月02日 新闻消息&#xff08;文/于泽&#xff09;&#xff1a;百度无人车可谓狠狠的吸足了大众的眼球。一个问题逐渐出现在我们心中&#xff0c;为什么百度这样的互联网企业会推出无人车&#xff0c;似乎搜索引擎和无人车之间的关联度并不是很高。 谜题的…

Docker Compose 项目

二、Docker Compose 项目compose项目简介compose项目来源于之前的Fig项目&#xff0c;使用python代码编写。compose项目主要用于编排部署基于docker的应用。本身与docker&#xff0f;swarm配合度很高。Docker Compose 是 Docker 编排服务的一部分&#xff0c;可以让用户在其它平…

android 获取sd卡目录失败_树莓派对SD卡的大小,速度有哪些要求?

SD卡容量的大小通过NOOBS安装带有桌面和推荐软件&#xff08;完整&#xff09;的 Raspberry Pi OS&#xff0c;SD卡最小为16GB。 对于带有桌面和推荐软件的 Raspberry Pi OS 镜像安装&#xff0c;SD卡最小为8GB。对于安装 Raspberry Pi OS Lite&#xff0c;建议 SD 卡最小为4GB…

区分同源与非同源

2019独角兽企业重金招聘Python工程师标准>>> JSONP和AJAX相同&#xff0c;都是客户端向服务器端发送请求&#xff1a;1、给服务器端传递内容2、从服务器端获取数据 的方式 AJAX属于同源策略 JSONP属于非同源策略(跨域请求) -> 实现跨域请求的方式有很多种&#x…