wxy 4.14 #15 [Cloned]

v>

wxy 4.14 #15 [Cloned]
活生生把ACM赛制打成OI赛制的一场,就交了签到题然后就一直in queue还好都一发A了,刺激。
A
写得有点慢了,刚开始对应关系弄反了,采用模块化的设计思想,直接先解决对应关系搞一个数组就可
以了。然后看转换后的字符串是否所有的字母都是存在的即可。
B
直接一个一个查看是否和x的gcd大于1即可
C
把有朋友关系的都放在一个集合里面,把编号最小的作为并查集的标记,最后遍历把每个集合的大小求
出来,取前k个即可
D
根据方程可以解出来星期二多出来的有多少钱,然后分别按照题意算每天的即可
E
给定一些颜色转换条件,问最后有多少个点是想要的颜色。可以采用模块化思想,先把颜色转换写出
来,抓住转换条件。
对于每一块,都转换成点上的一次颜色,然后计算。
# include <bits/stdc++.h>
using namespace std;
map<string,int> ID;
char s[10];
int cnt[100][100][10];
int cal(int A,int B,int C)
{
if(A&&B&&C) return 6;
if(!A&&!B&&!C) return -1;
if(A&&!B&&!C) return 0;
if(!A&&B&&!C) return 1;
if(!A&&!B&&C) return 2;
if(!A){
if(B==C) return 3;
return 7;
}
if(!B){
if(A==C) return 4;
return 7;
}
if(!C){
if(B==A) return 5;
return 7;
}
}
int main()F
签到题
直接用矩阵快速幂找规律,太慢了。。。
其实直接就可以看出来的,Sn=2Sn−1−Sn−2. ---->Sn-Sn-1=Sn-1-Sn-2,且S0=0,S1=1,那么可以看出
来是公差为1的等差数列,更可以说是i本身.
G
问题可以转化成画一条水平线,有多少三角形穿过。可以用树状数组来做。
对每一个三级小型,有可能穿过的范围都是三个点中maxy~miny,只要add(miny,1),add(maxy+1,-1)即
可,且对坐标进行出来,把范围放到1~2000001范围内,最后遍历一百年所有的,每次ans和sum(i)比
较即可。
{
ID["RED"]=0,ID["BLUE"]=1,ID["YELLOW"]=2;
ID["GREEN"]=3,ID["ORANGE"]=4,ID["VIOLET"]=5;
ID["BROWN"]=6,ID["PINK"]=7;
int R,C,N,x,y,k;
scanf("%d%d%d",&R,&C,&N);
scanf("%s",s);
int P=ID[s];
for(int i=1;i<=N;++i){
scanf("%s%d%d%d",s,&x,&y,&k);
int col=ID[s];
int Lr=max(1,x-k/2),Lc=(1,y-k/2);
if(k%2==0) Lr=max(1,x-k/2+1),Lc=max(1,y-k/2+1);
int Rr=min(R,Lr+k-1),Rc=min(C,Lc+k-1);
for(int r=Lr;r<=Rr;++r){
for(int c=Lc;c<=Rc;++c){
cnt[r][c][col]++;
}
}
}
int ans=0;
for(int r=1;r<=R;++r){
for(int c=1;c<=C;++c){
int col=cal(cnt[r][c][0],cnt[r][c][1],cnt[r][c][2]);
if(col==P) ans++;
}
}
printf("%d\n",ans);
return 0;
}
# include <bits/stdc++.h>
using namespace std;
const int MAXN=2e6+100;
const int base=1e6;
int c[MAXN]; //a原数组 c求和后数组
int lowbit(int x){ return x&(-x); }
void add(int x,int y) //x更新位置 y为更新后的数
{
for(int i=x;i<MAXN;i+=lowbit(i)){H
每太看懂做法。。。先贴着
根据enis的显示是有n个点的完全图删除0--n条边,然后所有的到的子图的联通分量的总和。
c[i]+=y;
}
return ;
}
int sum(int x) //1-x 求和
{
int ans=0;
for(int i=x;i;i-=lowbit(i)){
ans+=c[i];
}
return ans;
}
int main()
{
int n; scanf("%d",&n);
int x0,y0,x1,y1,x2,y2;
int cnt=0;
for(int i=1;i<=n;++i){
scanf("%d%d%d%d%d%d",&x0,&y0,&x1,&y1,&x2,&y2);
y0+=base+1,y1+=base+1,y2+=base+1;
if(y1<y0) swap(x0,x1),swap(y0,y1);
if(y2<y0) swap(x0,x2),swap(y0,y2);
if(y2<y1) swap(x2,x1),swap(y2,y1);
add(y0,1); add(y2+1,-1);
}
int ans=0;
for(int i=1;i<=2e6+1;++i){
ans=max(ans,sum(i));
}
printf("%d\n",ans);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 3005;
const int MOD = 1e9 + 7;
typedef long long LL;
int n, c[N][N], fac[N];
LL f[N], g[N], h[N], s[N][N];
LL fp(LL a, LL b) {
a %= MOD;
LL res = 1;
while (b) {
if (b & 1) res = res * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return res;
}I
可以根据x2-ax+1=0将次
void init() {
fac[0] = 1;
for (int i = 0; i < N; i++) {
fac[i] = 1LL * i * fac[i - 1] % MOD;
}
for (int i = 0; i < N; i++) {
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; j++) {
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD;
}
}
}
int main() {
init();
scanf("%d", &n);
h[0] = 1;
LL two = 1LL;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
g[i] = (g[i] + c[i-1][j-1] * f[j] % MOD * h[i - j] % MOD) % MOD;
//cout << "add: " << c[i - 1][j - 1] * f[j] % MOD * h[i - j] %
MOD << endl;
}
h[i] = h[i - 1] * two%MOD;
two = two * 2 % MOD;
f[i] = (h[i] - g[i] % MOD + MOD) % MOD;
//cout << i << "->" << h[i] << '=' << g[i] << '+' << f[i] << endl;
}
LL ans = 0;
for (int i = 1; i <= n; i++) {
//枚举单独联通块大小,计算有多少图包含此大小联通块
ans = (ans + c[n][i] * h[n - i] % MOD * f[i] % MOD) % MOD;
}
printf("%lld\n", ans);
return 0;
}
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=100+10;
const LL mod=1e9+7;
LL a,n;
LL mp[MAXN][2];
LL solve(LL x,LL step,LL c)
{
if(x==1) return a;
if(mp[step][c]) return mp[step][c];
LL res;
if(x%2) res=(solve(x/2,step+1,0)*solve(x/2+1,step+1,1)%mod-a+mod)%mod;
else res=(solve(x/2,step+1,c)*solve(x/2,step+1,c)%mod-2+mod)%mod;
return mp[step][c]=res;}
int main()
{
LL T; scanf("%lld",&T);
while(T--){
memset(mp,0,sizeof(mp));
scanf("%lld%lld",&a,&n);
if(!n){
printf("2\n");
continue;
}
a=(a%mod+mod)%mod;
if(n<0) n=-n;
printf("%lld\n",solve(n,0,0));
}
return 0;
}
posted @ 2022-02-27 13:09  fengzlj  阅读(18)  评论(0)    收藏  举报