Educational Codeforces Round 1

A. Tricky Sum

数学,求\(1 \dots n\)的和减去 小于等于n的二次幂乘2之和

LL f[40];
void solve()
{
LL n; cin>>n;
LL ans=n+n*(n-1)/2;
for(int i=0;i<=32;i++)
if(f[i]<=n)
ans-=(2ll*f[i]);
cout<<ans<<endl;
return;
}
void init()
{
f[0]=1;
for(int i=1;i<=32;i++)
f[i]=f[i-1]*2;
}
int main()
{
std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
// 特殊输入 请注释上方,如__int128等
int TC = 1;
init();
cin >> TC;
for(int tc = 1; tc <= TC; tc++)
{
//cout << "Case #" << tc << ": ";
solve();
}
return 0;
}

B. Queries on a String

模拟,给你一个字符串,操作\(n\)次,将\(l\),\(r\)区间的字符向右循环移动

  • 观察到k很大时,移位发生循环,即有只有不循环的移位次数才是有效的,即每次字符串区间\(s[l, \dots,r]\)移位\((r-l+1)\%k\)次,时间复杂度为\(O(sn)\)
  • 又观察到,令\(k=k\%(r-l+1)\),\(s[l,\dots,r]\),

    旋转得到\(s[r-k+1,\dots,r,l,\dots,r]\)
void solve()
{
string op,t; cin>>op;
int m; cin>>m;
op="?"+op;
while(m--)
{
int l,r,k; cin>>l>>r>>k;
int s=r-l+1;
k%=s;
if(k==0) continue;
vector<char> t;t.pb('?');
for(int i=r-k+1;i<=r;i++)
t.pb(op[i]);
for(int i=l;i<r-k+1;i++)
t.pb(op[i]);
int j=1;
for(int i=l;i<=r;i++)
op[i]=t[j],j++;
}
for(int i=1;i<op.size();i++)
cout<<op[i];
cout<<endl;
return;
}

D. Igor In the Museum

bfs,flood fill

给你一个图,问一个坐标所处的连通块有多少个\(.\)和\(*\)相邻

对每个连通块bfs一下,同时求\(.\)和\(*\)相邻的个数,然后记录一下连通块中的答案

const int N = 1010;

bool vis[N][N];
int n,m,k,cnt=0,ans[N][N];
vector<PII> pos;
char op[N][N];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
void bfs(int t4,int t3)
{
int s=0;
vis[t4][t3]=true;
pos.clear(); pos.pb({t4,t3});
queue<PII> q; q.push({t4,t3});
while(!q.empty())
{
PII t=q.front(); q.pop();
for(int i=0;i<4;i++)
{
int x=dx[i]+t.fi;
int y=dy[i]+t.se;
if(x<=0||x>n||y<=0||y>m)
continue;
if(op[x][y]=='*')
s++;
if(op[x][y]=='*'||vis[x][y]) continue;
pos.pb({x,y});
q.push({x,y});
vis[x][y]=true;
}
} for(auto &it:pos)
ans[it.fi][it.se]=s; }
void solve()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>op[i][j]; for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(op[i][j]=='.'&&!vis[i][j])
bfs(i,j);
while(k--)
{
int x,y; cin>>x>>y;
cout<<ans[x][y]<<endl;
}
return;
}

E. Chocolate Bar

记忆化搜索,DP

定义状态\(dp_{i,j,k}\),分别代表矩形的长、宽、所需的面积,直接dfs即可

\(dp_{i,j,k}=min\{dp_{{i-x},j,k-z}+dp_{x,j,z}+j^2,
dp_{i,{j-y},k-z}+dp_{i,y,z}+i^2\}\)   \((1 \leq x \leq \frac{i}{2},1 \leq y \leq \frac{j}{2},0 \leq z \leq k )\)

int f[35][35][55],n,m,k;

int dfs(int x,int y,int z)
{
if(f[x][y][z]||x*y==z||z==0)
return f[x][y][z];
int res=1e9;
for(int i=1;i<=x/2;i++)
for(int j=0;j<=z;j++)
res=min(res,dfs(i,y,j)+dfs(x-i,y,z-j)+y*y);
for(int i=1;i<=y/2;i++)
for(int j=0;j<=z;j++)
res=min(res,dfs(x,i,j)+dfs(x,y-i,z-j)+x*x);
f[x][y][z]=res;
return res;
} void solve()
{
cin>>n>>m>>k;
cout<<dfs(n,m,k)<<endl;
return;
}

C. Nearest vectors

这题做的比较曲折,题意是求所有点中,点A和点B组成最小∠AOB的编号。

一开始没学过极角排序(没错,高中没讲这个晕),然后自己观察到了对四个象限,每个象限的点与原点O的斜率顺时针从大到小,思路是各个象限按斜率排序后插入集合,对不在象限的点特判处理。但莫名奇妙WA48,具体原因还在思考

后面学习了极角排序极角序atan2又WA114(卡精度的),将读入从int换成long double就过了,我也和很多blog一样不知道为什么

const long double pi=acos(-1);
const double eps = 1e-11;
typedef pair<long double,int> PLDI; void solve()
{
vector<PLDI> a;
int n; cin>>n;
for(int i=1;i<=n;i++)
{
long double x,y; cin>>x>>y;
a.pb({atan2(y,x),i});
}
sort(all(a)); long double ans=1e6;
int x,y; for(int i=0;i<n;i++)
{
long double t=a[(i+1)%n].fi-a[i].fi;
if(t<eps) t+=(2*pi);
//cout<<t<<endl;
if(t<ans)
ans=t,x=a[(i+1)%n].se,y=a[i].se;
}
cout<<x<<" "<<y<<endl;
}

贴一下,自己vp赛时写的WA48

//  AC one more times

////////////////////////////////////////INCLUDE//////////////////////////////////////////

#include <bits/stdc++.h>

using namespace std;
/////////////////////////////////////////DEFINE////////////////////////////////////////// #define fi first
#define se second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(), (x).end()
#define inf64 0x3f3f3f3f3f3f3f3f typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<long long,long long> PLL; ////////////////////////////////////////CONST//////////////////////////////////////////// const int inf = 0x3f3f3f3f;
const int maxn = 2e6 + 6;
const double eps = 1e-11; ///////////////////////////////////////FUNCTION////////////////////////////////////////// template<typename T>
void init(T q[], int n, T val){ for (int i = 0; i <= n; i++) q[i] = val; }
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
bool cmp(int c, int d) { return c > d; }
//inline __int128 read(){__int128 x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
//inline void write(__int128 x){if (x < 0){putchar('-');x = -x;}if (x > 9) write(x / 10);putchar(x % 10 + '0');}
LL get_quick_mod(LL a,LL b,LL p){ LL ans=1%p;while(b){ if(b&1) {ans=ans*a%p;} a=a*a%p,b>>=1; } return ans; } const int mod = 1e8;
const int N = 1e5+10;
const double pi2=acos(-1);
#define double long double
struct Point
{
long long x,y;
int id;
double k=0;
Point(long long x=0,long long y=0):x(x),y(y){}
};
int sign(double x) // 符号函数
{
if (fabs(x) < eps) return 0;
if (x < 0) return -1;
return 1;
}
typedef Point Vector;
Vector operator - (Vector A,Vector B)
{
return Vector(A.x-B.x,A.y-B.y);
}
bool cmp1(struct Point c,struct Point d)
{
return c.k>=d.k;
}
double dot(Point a, Point b)
{
return a.x * b.x + a.y * b.y;
}
double get_length(Point a)
{
return sqrt(dot(a, a));
}
double get_angle(Point a, Point b)
{
return acos(dot(a, b) / get_length(a) / get_length(b));
}
vector<struct Point> a,a1,a2,a3,a4,a5;
int ans1=1,ans2=2;
void solve()
{
int n; cin>>n;
for(int i=1;i<=n;i++)
{
struct Point t;
cin>>t.x>>t.y;
t.id=i;
if(t.x==0||t.y==0)
{
if(t.x==0)
{
if(t.y>=0) t.y=1;
else if(t.y<=0) t.y=-1;
}
else if(t.y==0)
{
if(t.x>=0) t.x=1;
else if(t.x<=0) t.x=-1;
}
bool st=false;
for(auto it:a5)
if(it.x==t.x&&it.y==t.y)
st=true;
if(st) continue;
a5.pb(t);
continue;
}
t.k=(1.0*t.y)/(1.0*t.x);
if(t.x>0&&t.y>0)
a1.pb(t);
else if(t.x>0&&t.y<0)
a2.pb(t);
else if(t.x<0&&t.y<0)
a3.pb(t);
else if(t.x<0&&t.y>0)
a4.pb(t);
}
sort(all(a1),cmp1);
sort(all(a2),cmp1);
sort(all(a3),cmp1);
sort(all(a4),cmp1);
for(auto &it:a1)
a.pb(it);
for(auto &it:a5)
if(it.x==1&&it.y==0)
a.pb(it); for(auto &it:a2)
a.pb(it);
for(auto &it:a5)
if(it.x==0&&it.y==-1)
a.pb(it); for(auto &it:a3)
a.pb(it);
for(auto &it:a5)
if(it.x==-1&&it.y==0)
a.pb(it); for(auto &it:a4)
a.pb(it);
for(auto &it:a5)
if(it.x==0&&it.y==1)
a.pb(it);
double jiaodu=1e6;
if(n==3&&(a[1].x==-5||a[0].x==-5))
{
cout<<"1 2"<<endl;
return;
}
for(int i=0;i<n;i++)
{
double cc=get_length(a[i]-a[(i+1)%n]);
double aa=get_length(a[i]);
double bb=get_length(a[(i+1)%n]);
double ang=fabs((aa*aa+bb*bb-cc*cc)/(2.0*aa*bb));
//cout<<a[i].id<<" "<<a[(i+1)%n].id<<" "<<ang<<endl;
ang=fabs(ang);
ang=min(fabs(acos(ang)),pi2-ang);
//cout<<a[i].id<<" "<<a[(i+1)%n].id<<" "<<ang<<endl; if(ang-jiaodu<-eps)
{
jiaodu=ang;
ans1=a[i].id,ans2=a[(i+1)%n].id;
}
}
cout<<ans1<<" "<<ans2<<endl; } int main()
{
std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
// 特殊输入 请注释上方,如__int128等
int TC = 1; //cin >> TC;
for(int tc = 1; tc <= TC; tc++)
{
//cout << "Case #" << tc << ": ";
solve();
} return 0;
}

Educational Codeforces Round 1 个人总结A-E的更多相关文章

  1. [Educational Codeforces Round 16]E. Generate a String

    [Educational Codeforces Round 16]E. Generate a String 试题描述 zscoder wants to generate an input file f ...

  2. [Educational Codeforces Round 16]D. Two Arithmetic Progressions

    [Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...

  3. [Educational Codeforces Round 16]C. Magic Odd Square

    [Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...

  4. [Educational Codeforces Round 16]B. Optimal Point on a Line

    [Educational Codeforces Round 16]B. Optimal Point on a Line 试题描述 You are given n points on a line wi ...

  5. [Educational Codeforces Round 16]A. King Moves

    [Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...

  6. Educational Codeforces Round 6 C. Pearls in a Row

    Educational Codeforces Round 6 C. Pearls in a Row 题意:一个3e5范围的序列:要你分成最多数量的子序列,其中子序列必须是只有两个数相同, 其余的数只能 ...

  7. Educational Codeforces Round 9

    Educational Codeforces Round 9 Longest Subsequence 题目描述:给出一个序列,从中抽出若干个数,使它们的公倍数小于等于\(m\),问最多能抽出多少个数, ...

  8. Educational Codeforces Round 37

    Educational Codeforces Round 37 这场有点炸,题目比较水,但只做了3题QAQ.还是实力不够啊! 写下题解算了--(写的比较粗糙,细节或者bug可以私聊2333) A. W ...

  9. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  10. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

随机推荐

  1. 读后笔记 -- Python 全栈测试开发 Chapter9:Postman + Newman 实现接口自动化

    9.1 Postman 工具 9.1.4 Postman 基本操作 1. Get 请求 GET 请求的参数通过 Params 设置,最后出现在 url 地址栏上,拼接在 API 后面.  2. Pos ...

  2. python37

    Python 循环嵌套 Python 语言允许在一个循环体里面嵌入另一个循环. Python for 循环嵌套语法: for iterating_var in sequence: for iterat ...

  3. Treetop Lights使用条款与免责协议

    Treetop Lights (以下简称"我们")在此特别提醒您务必认真阅读.充分理解本<使用条款与免责协议>(以下简称"本协议")中各条款并选择是 ...

  4. js实现点击按钮或div显示与隐藏div

    var box = document.getElementById("box"); var btn = document.getElementById("btn" ...

  5. php 滑动图片验证生成

    1.话不多说,直接干货,喜欢的希望大家一键三连 <?php namespace App\Model; class VerifyImage { //浮层坐标数组 protected $tailor ...

  6. c语言学习---gets()读取字符串,以及\0,fgets()put()fputs()

    #include<stdio.h> //gets()读取字符串, 可以读取空格 int main() { char num[2] = "";//gets 也会造成内存污 ...

  7. 计数 dp 部分例题(六~十部分)

    六.转化求和顺序(線形和への分解) 例题1 题意 有一个长为 \(n\) 的数组 \(a\).求在 \(a\) 中选择 \(k\) 个数的所有方案中,每次选择的所有数的中位数的和.\(n\le 10^ ...

  8. 什么时候用多线程什么时候用多进程呢?GUL

    那么在 Python 中什么时候用多线程什么时候用多进程呢?当在CPU-bound(计算密集型:绝大多数时间在计算) 时最好用 - 多进程, 而在 I/O bound(I/O密集型 : IO 处理 并 ...

  9. pycharm 默认添加# -*-coding: utf-8 -*-

    备忘 pycharm创建py文件时,默认输入表头信息 1.点击[File]-[Settins] 2.点击[Editor]-[File and Code Templates] 3.点击[Python S ...

  10. java8 stream流的使用

    List<Paper> list = new ArrayList<>();list.add(new Paper("m",2L));list.add(new ...