A Mishka and Contest
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = (int) 1e5 + 11;
const int M = (int) 1e6 + 11;
const int mod = (int) 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int PI = acos(-1.0);
int A[N];
int main(){
int n,m; scanf("%d%d",&n,&m);
int l = 0, r = n - 1;
int sum = 0;
for(int i=0;i<n;i++) scanf("%d",&A[i]);
for(int i=0;i<n;i++){
if(A[i]>m){ l = i; break; }
}
for(int i=n-1;i>=0;i--){
if(A[i]>m){
r = i;break;
}
}
if(r==n-1 && l==0 &&A[0]<=m&&A[n-1]<=m) printf("%d\n", n);
else printf("%d\n", n-(r-l)-1);
return 0;
}
B Reversing Encryption
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = (int) 1e5 + 11;
const int M = (int) 1e6 + 11;
const int mod = (int) 1e9 + 7;
const int inf = 0x3f3f3f3f;
vector<int>ve;
void get(int n){
for(int i = n; i >= 1 ; i--){
if(n % i == 0) {
ve.push_back(i);
// printf("%d \n", i);
}
}
sort(ve.begin(), ve.end());
}
int main(){
int n; scanf("%d", &n);
get(n);
string s; cin>> s;
for(int i = 0; i < ve.size(); i++){
int v = ve[i];
reverse(s.begin(), s.begin() + v);
}
cout<< s<<"\n";
return 0;
}
C Alphabetic Removals
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = (int) 4e5 + 11;
const int M = (int) 1e6 + 11;
const int mod = (int) 1e9 + 7;
const int inf = 0x3f3f3f3f;
vector<int> ve[N];
int vis[N];
int main(){
int n, k; scanf("%d%d", &n, &k);
string s; cin>>s;
for(int i = 0; s[i]; i++){
ve[s[i] - 'a'].push_back(i);
}
for(int i = 0; i < 26; i++){
for(int j = 0; j < ve[i].size(); j++){
int pos = ve[i][j];
vis[pos] = 1;
k --;
if(k == 0) break;
}
if(k == 0 )break;
}
for(int i = 0; s[i]; i++){
if(!vis[i]) printf("%c", s[i]);
}
return 0;
}
E Reachability from the Capital ##
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#define CLR(a,b) memset((a),(b),sizeof(a))
#define inf 0x3f3f3f3f
#define mod 100009
#define LL long long
#define M 11000
#define ll o<<1
#define rr o<<1|1
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
using namespace std;
void read(int &x){
x=0;char c;
while((c=getchar())<'0');
do x=x*10+c-'0';while((c=getchar())>='0');
}
struct Edge {
int from,to,next;
}edge[M];
int head[M],top;
int n,m;
vector<int>G[M];
vector<int >scc[M];
int scc_cnt,dfs_clock;
int low[M],dfn[M],in[M],out[M];
stack<int>S;int Instack[M];
int sccno[M];
void init()
{
top=0;
memset(head,-1,sizeof(head));
while(!S.empty()) S.pop();
}
void addedge(int a,int b)
{
Edge e={a,b,head[a]};
edge[top]=e; head[a]=top++;
}
void getmap()
{
int i,j;int a,b;
for(i=0;i<m;i++)
{
read(a);read(b);
addedge(a,b);
}
}
void tarjan(int now)
{
int nexts;
low[now]=dfn[now]=++dfs_clock;
S.push(now);Instack[now]=1;
for(int i=head[now];i!=-1;i=edge[i].next)
{
Edge e=edge[i];
if(!dfn[e.to])
{
tarjan(e.to);
low[now]=min(low[e.to],low[now]);
}
else if(Instack[e.to])
low[now]=min(low[now],dfn[e.to]);
}
if(dfn[now]==low[now])
{
scc_cnt++;
scc[scc_cnt].clear();
for(;;)
{
nexts=S.top();S.pop();Instack[nexts]=0;
sccno[nexts]=scc_cnt;
scc[scc_cnt].push_back(nexts);
if(nexts==now) break;
}
}
}
void find_cut(int le,int ri)
{
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(Instack,0,sizeof(Instack));
memset(sccno,0,sizeof(sccno));
scc_cnt=dfs_clock=0;
for(int i=le;i<=ri;i++)
if(!dfn[i]) tarjan(i);
}
void suodian()
{
int i,j;
for(i=1;i<=scc_cnt;i++) G[i].clear(),in[i]=0,out[i]=0;
for(i=0;i<top;i++)
{
int u=sccno[edge[i].from];
int v=sccno[edge[i].to];
if(v!=u)
{
G[u].push_back(v);
in[v]++;out[u]++; // 统计新点的入度和出度
}
}
}
/* 以上是scc + 缩点代码 */
int s;
bool vis[M];
void dfs(int now){
vis[now] = 1;
for(int i = 0; i < G[now].size(); i++){
int v = G[now][i];
if(!vis[v]) dfs(v);
}
}
void solve(){
dfs(sccno[s]);
int cnt = 0;
for(int i = 1; i <= scc_cnt; i++){
if(!vis[i] && !in[i]) {
cnt++; dfs(i);
}
}
printf("%d\n", cnt);
}
int main()
{
scanf("%d%d%d", &n, &m, &s);
init();
getmap();
find_cut(1,n);
suodian();
solve();
return 0;
}
F Cards and Joy
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = (int) 500 + 11;
const int M = (int) 5000 + 11;
const int mod = (int) 1e9 + 7;
const int inf = 0x3f3f3f3f;
map<int, int> cnt, ge;
map<int, int> ::iterator it;
int h[N];
ll dp[M][N];
ll solve(ll k, ll x, ll y){ // 喜欢数字val(随意)的人有x个,本序列总共有y个val,每个人最多选k个
for(int i = 0; i <= y; i++){
for(int j = 0; j <= x; j++){
dp[i][j] = 0;
}
}
// 递推不动当时 TAT
for(int i = 1; i <= y; i++){
for(int j = 1; j <= x; j++){
for(int u = 1; u <= i && u <= k; u++){
dp[i][j] = max(dp[i][j], dp[i - u][j - 1] + h[u]);
}
}
}
return dp[y][x];
}
int main(){
ll n, k; scanf("%lld%lld", &n, &k);
for(int i = 0; i < n * k; i++){
int val; scanf("%d", &val);
cnt[val]++;
}
for(int i = 0; i < n; i++){
int f;scanf("%d", &f);
ge[f] ++;
}
for(int i = 1; i <= k; i++) scanf("%d", &h[i]);
ll ans = 0;
for(it = ge.begin(); it != ge.end(); it++){
ans += solve(k, it->second, cnt[it->first]);
}
printf("%lld", ans);
return 0;
}