gym 101858

我这个傻逼被治了一下午。

大好的橘势,两个小时6T,去看L,哇傻逼题。然后我跑的最短路T到自闭

最后十几分钟去想了下A,一直在想如何表示状态。。就是想不到二进制搞一下。。。

然后游戏结束了。。以后我就是蓝名之耻了。(注:此称号送给一场比赛里排名最低的蓝名选手)

所以非常凄惨到现在也只有8个,,我还想AK来着,,毕竟有紫名选手AK了,那我1800多分也差不多叭

注意:堆优化dijkstra的复杂度是mlogm!!!

注意:堆优化dijkstra的复杂度是mlogm!!!

注意:堆优化dijkstra的复杂度是mlogm!!!

A:貌似有奇怪的式子或者更佳的转移方式?

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll mod = 1e9+7;
 5 ll f[2][8];
 6 int n;
 7 void init(){
 8     f[0^1][7]=1;
 9     int cnt=0;
10     while (cnt<n){
11         cnt++;
12         int i=cnt%2;
13         f[i^1][0]=f[i][7];
14
15         f[i^1][1]=f[i][6];
16
17         f[i^1][2]=f[i][5];
18
19         f[i^1][3]=f[i][7]+f[i][4];
20
21         f[i^1][4]=f[i][3];
22
23         f[i^1][5]=f[i][2];
24
25         f[i^1][6]=f[i][7]+f[i][1];
26
27         f[i^1][7]=f[i][6]+f[i][3]+f[i][0];
28
29         for(int j=0;j<=7;j++){
30             f[i^1][j]%=mod;
31         }
32     }
33 }
34 int main(){
35     ios::sync_with_stdio(false);
36     cin>>n;
37     init();
38     if(n&1){
39         cout<<min(f[0][7],f[1][7]);
40     } else{
41         cout<<max(f[0][7],f[1][7]);
42     }
43 }

B:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 string s;
 5 int main(){
 6     ios::sync_with_stdio(false);
 7     cin>>s;
 8     int nc=0,ns=0;
 9     for(int i=0;i<s.length();i++){
10         if(s[i]==‘C‘&&nc<2){
11             nc++;ns=0;
12             cout<<‘B‘;
13         } else if(s[i]==‘C‘&&nc==2){
14             cout<<‘P‘;
15             nc=0;ns=0;
16         } else if(s[i]==‘S‘&&ns<2){
17             ns++;cout<<‘D‘;nc=0;
18         } else{
19             ns=0;nc=0;cout<<‘T‘;
20         }
21     }
22 }

C:

D:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int n;ll s;
 5 int main(){
 6     ios::sync_with_stdio(false);
 7     cin>>n;
 8     while (n--){
 9         cin>>s;
10         ll l=0,r=15e8;
11         while (l<=r){
12             ll mid = l+r>>1;
13             if((mid+1)*mid/2<=s){
14                 l=mid+1;
15             } else {
16                 r=mid-1;
17             }
18         }
19         cout<<r<<endl;
20     }
21 }

E:

F:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 1e5+5;
 5 int n,m;
 6 struct Edge{
 7     int u,v;
 8 }e[N];
 9 int a[N],ans[N];
10 int fa[N];
11 int find(int x){
12     return x==fa[x]?x:fa[x]=find(fa[x]);
13 }
14 int main(){
15     ios::sync_with_stdio(false);
16     cin>>n>>m;
17     for(int i=1;i<=m;i++){
18         fa[i]=i;
19         cin>>e[i].v>>e[i].u;
20     }
21     for(int i=1;i<=m;i++){
22         cin>>a[i];
23     }
24     ans[m+1]=n;
25     for(int i=m;i>=1;i--){
26         int u=find(e[a[i]].u),v=find(e[a[i]].v);
27         if(u==v){
28             ans[i]=ans[i+1];
29         } else{
30             fa[u]=v;
31             ans[i]=ans[i+1]-1;
32         }
33     }
34     for(int i=2;i<=m+1;i++){
35         cout<<ans[i]<<endl;
36     }
37 }

G:

H:被坑了好久才反应过来

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 double n,a,p;
 5 int main(){
 6     scanf("%lf%lf%lf",&n,&a,&p);
 7     p/=100;
 8     double x = p-(1-p);
 9     n+=a*x;
10     printf("%.10f\n",n);
11 }

I:判点在多边形内部板子

#include <bits/stdc++.h>
using namespace std;
typedef double db;
const db eps=1e-6;
const db pi=acos(-1);
int sign(db k){
    if (k>eps) return 1; else if (k<-eps) return -1; return 0;
}
int cmp(db k1,db k2){return sign(k1-k2);}
int inmid(db k1,db k2,db k3){ return sign(k1-k3)*sign(k2-k3)<=0;}
struct point {
    db x,y;
    point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
    point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
    point operator * (db k1) const{return (point){x*k1,y*k1};}
    point operator / (db k1) const{return (point){x/k1,y/k1};}
    bool operator == (const point &k1) const{return cmp(x,k1.x)==0&&cmp(y,k1.y)==0;}
    db abs(){ return sqrt(x*x+y*y);}
    db abs2(){return x*x+y*y;}
    db dis(point k1){ return (*this-k1).abs();}
    bool operator<(const point &k1)const{
        int c = cmp(x,k1.x);
        if(c)return c==-1;
        return cmp(y,k1.y)==-1;
    }
};
int inmid(point k1,point k2,point k3){return inmid(k1.x,k2.x,k3.x)&&inmid(k1.y,k2.y,k3.y);}
db cross(point k1,point k2){ return k1.x*k2.y-k1.y*k2.x;}
int onS(point k1,point k2,point q){return inmid(k1,k2,q)&&sign(cross(k1-q,k2-k1))==0;}
db dot(point k1,point k2){ return k1.x*k2.x+k1.y*k2.y;}
vector<point> convexHull(vector<point> ps){
    int n = ps.size();if(n<=1)return ps;
    sort(ps.begin(),ps.end());
    vector<point> qs(n*2);int k = 0;
    for(int i=0;i<n;qs[k++]=ps[i++])
        while (k>1&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k;
    for(int i=n-2,t=k;i>=0;qs[k++]=ps[i--])
        while (k>t&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k;
    qs.resize(k-1);
    return qs;
}
int contain(vector<point>A,point q){//0外边
    int pd=0;A.push_back(A[0]);
    for(int i=1;i<A.size();i++){
        point u=A[i-1],v=A[i];
        if(onS(u,v,q))return 1;if (cmp(u.y,v.y)>0) swap(u,v);
        if(cmp(u.y,q.y)>=0||cmp(v.y,q.y)<0)continue;
        if(sign(cross(u-v,q-v))<0)pd^=1;
    }
    return pd<<1;
}
vector<point>p[5];
int s,r,m;
int n;
point tmp;
int main(){
    scanf("%d%d%d",&s,&r,&m);
    for(int i=1;i<=s;i++){
        scanf("%lf%lf",&tmp.x,&tmp.y);p[1].push_back(tmp);
    }
    for(int i=1;i<=r;i++){
        scanf("%lf%lf",&tmp.x,&tmp.y);p[2].push_back(tmp);
    }
    for(int i=1;i<=m;i++){
        scanf("%lf%lf",&tmp.x,&tmp.y);p[3].push_back(tmp);
    }
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&tmp.x,&tmp.y);
        if(contain(p[1],tmp)){
            printf("Sheena\n");
        } else if(contain(p[2],tmp)){
            printf("Rose\n");
        } else if(contain(p[3],tmp)){
            printf("Maria\n");
        } else{
            printf("Outside\n");
        }
    }
}

J:反着来维护区间和

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 1e6+6;
 5 int n;
 6 int a[N],c[N];
 7 int lowbit(int k){ return k&-k;}
 8 void upd(int pos,int num){
 9     while (pos<=1e6+1){
10         c[pos]+=num;
11         pos+=lowbit(pos);
12     }
13 }
14 int sum(int pos){
15     int res = 0;
16     while (pos>0){
17         res+=c[pos];
18         pos-=lowbit(pos);
19     }
20     return res;
21 }
22 int ans[N];
23 int main(){
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++){
26         cin>>a[i];a[i]++;
27         ans[i] = n-(i-1-sum(a[i]-1));
28         upd(a[i],1);
29     }
30     for(int i=1;i<=n;i++){
31         printf("%d\n",ans[i]);
32     }
33 }

K:

L:为什么这么傻逼的O(n)的做法我当时会想不到呢。。。

 1 #include <bits/stdc++.h>
 2 #define pii pair<int,int>
 3 #define mk(a,b) make_pair(a,b)
 4 using namespace std;
 5 typedef long long ll;
 6 vector<int> g[100005];
 7 map<pii,int> mp;
 8 struct Node{
 9     int x,y;
10 }node[100005];
11 bool cmp(Node a,Node b){ return a.x<b.x;}
12 int n,l;
13 int dep[100005];
14 void dfs(int v){
15     for(int i=0;i<g[v].size();i++){
16         int u = g[v][i];
17         if(dep[v]+1>dep[u]) {
18             dep[u]=dep[v]+1;
19             dfs(u);
20         }
21     }
22 }
23 int main(){
24     scanf("%d%d",&n,&l);
25     node[1]={0,0};
26     mp[mk(0,0)]=0;
27     for(int i=1;i<=n;i++){
28         scanf("%d%d",&node[i].x,&node[i].y);
29     }
30     sort(node+1,node+1+n,cmp);
31     for(int i=1;i<=n;i++){
32         mp[mk(node[i].x,node[i].y)]=i;
33     }
34     node[n+1]={l,0};
35     mp[mk(l,0)]=n+1;
36     for(int i=0;i<=n;i++){
37         for(int j=1;j<=5;j++){
38             for(int k=-(5-j);k<=(5-j);k++){
39                 if(!mp.count(mk(node[i].x+j,node[i].y+k)))continue;
40                 if(abs(j)+abs(k)<=5){
41                     g[i].push_back(mp[mk(node[i].x+j,node[i].y+k)]);
42                 }
43             }
44         }
45     }
46     memset(dep,-0x3f, sizeof(dep));
47     dep[0]=0;
48     for(int i=0;i<=n;i++){
49         for(int j=0;j<g[i].size();j++){
50             int u = g[i][j];
51             dep[u]=max(dep[u],dep[i]+1);
52         }
53     }
54     printf("%d\n",dep[n+1]-1);
55 }

总结。打的太烂了。L被治了,A题好像也没带脑子。K看了两眼没兴趣,其他的没看。。。在两个小时以后就失去了生命迹象。。。

补题的话。如果下周四补了就是补了,否则应该就是不补了。。。(囤了好十几道题了我好慌啊!!!)

md等我过几天上紫了非得开教练模式爽一爽。越切越想要教练模式。。。

原文地址:https://www.cnblogs.com/MXang/p/10503381.html

时间: 2024-10-07 12:32:28

gym 101858的相关文章

CodeForces Gym 100935D Enormous Carpet 快速幂取模

Enormous Carpet Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Gym 100935D Description standard input/outputStatements Ameer is an upcoming and pretty talented problem solver who loves to solve problems using computers.

B - Average Gym - 101161B 组合数学

http://codeforces.com/gym/101161/attachments 今天被卡常了,其实是自己对组合数技巧研究的不够. 如果是n, m <= 1e5的,然后取模是质数,那么可以用费马小定理. 如果n, m都比较小,那么其实是直接杨辉三角.不用逆元那些. 这题的思路是,枚举每一一个ave,然后总和就是n * ave 相当于方程  x1 + x2 + .... + xn = n * ave中,在0 <= x[i] <= full的情况下,不同解的个数中,使得x[i] ==

Codeforces Gym 100269 Dwarf Tower (最短路)

题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game named "Dwarf Tower". In this game there are n different items,which you can put on your dwarf character. Items are numbered from 1 to n. Vasya want

CodeForces Gym 101063C 二进制压缩

http://codeforces.com/gym/101063/problem/C 给n个人,m样物品,每个人可以从物品中选择几样.两人选择物品的交集元素个数比上并集元素个数如果大于某个比例即可将两人配对.求配对数. n的范围是1e5,直接比较所有人的选择会TLE,应该将所有选择物品的情况用二进制压缩,m最大是10,情况数目小于2048,可以接受.注意配对总数范围应为long long. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> i

Gym 101246H ``North-East&#39;&#39;(LIS)

http://codeforces.com/gym/101246/problem/H 题意: 给出n个点的坐标,现在有一个乐队,他可以从任一点出发,但是只能往右上方走(包括右方和上方),要经过尽量多的点.输出它可能经过的点和一定会经过的点. 思路: 分析一下第一个案例,在坐标图上画出来,可以发现,他最多可以经过4个点,有两种方法可以走. 观察一下,就可以发现这道题目就是要我们求一个LIS. 首先,对输入数据排一下顺序,x小的排前,相等时则将y大的优先排前面. 用二分法求LIS,这样在d数组中就可

Gym 100712I Bahosain and Digits(开关翻转问题)

http://codeforces.com/gym/100712/attachments 题意: 给出一串数字,每次选择连续的k个数字加上任意数(超过10就取余),最后要使得所有数字都相等,求最大的k. 思路: 开关翻转问题. 算法具体可以参考<挑战程序竞赛>常用技巧篇. 这道题目就是在枚举k的同时再枚举一下最后要转换成的数字即可. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring>

很好的脑洞题:dfs+暴力 Gym - 101128A Promotions

http://codeforces.com/gym/101128 题目大意:给你一个a,b,e,p.有e个点,p条有向边,每条边为(x,y),表示x->y,每次我们都取出一个入度为0的,并且一次性取出来的个数为a(或b).当然,取出来的种类可能有很多种(即一个集合),问,这个集合中有多少个数字是相同的. 第一个输出集合长度为a的,第二个输出集合长度为b的,第三个输出无论如何都无法被取出的个数. 思路:建立正向图和反向图. 定义pair<int, int> interval[i] 表示第i

【树状数组】Gym - 101147J - Whistle&#39;s New Car

题意就是对每个点i,统计在其子树内(不含自身),且depj-depi<=xj的点有多少个. 把点分别按照dep-x和dep进行排序,离线处理, 每次把dep-x小于等于当前dep值的点插入树状数组,就变成了询问dfs序在一个区间内的点有多少个,可以用树状数组轻松解决. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int f,C; void R(int &am

SYSU-7, Gym 100273J, trie+hash

cnm毛子的题是正宗内家拳法啊orz(捶地),拼的就是智商,这题我们队想了老半天后缀自动机,掏出各种黑科技无果 题目大意:构建一个自动机可以表达给定的n个串,询问最小的自动机节点树为多少. 解:最裸的自动机其实就是一棵trie,那么我们考虑优化这棵trie,考虑拓扑排序倒过来做,可以发现其实如果两个节点如果他们指向的节点状态完全一致,那么这两个节点是等价的,所以我们不断合并这些节点即可.但是拓扑可能会慢,而且貌似会退化n方(没细想),但一般地,我们用dfs出栈序去做这个hash去重即可. cnm