Codeforces Round #451 Div. 2 C D E

C。Phone Numbers

之前没有做过字典树……感觉这个题字典树也能做……就拿来练一练字典树……板子好多地方写的都不够好,还需要继续改……

emmm这个……卡了好久啊……不过好在还是debug出来了……orz

虽然是处理后缀的问题,但是只需要reverse一下就可以变成前缀问题了2333333,然后每一次的字符串都插进去,最后从叶子到根遍历输出就可以了……

不过我好像……连叶子到根的遍历都写不好呜呜呜……ps:这里只是为了用trie而用trie……其实用map维护一下直接暴力求解就可以……

//trie树
 /*1. 字符串检索
   2.词频统计
   3.字符串排序  先序遍历
   4.前缀匹配
   */
#include<bits/stdc++.h>
using namespace std;
const int MAX=10;
string number;
int now,cnt=0;
int crt[25];
struct trie{
    trie *next[MAX];
    int v=0;
};
trie *root[20];
trie* creat_trie()
{
    trie *temp=(trie*)malloc(sizeof(trie));
    for(int i=0;i<10;i++)
     temp->next[i]=NULL;
    return temp;
}
void insert_trie(trie *r,string s,int k)
{
    trie *p=r;
    for(int i=0;i<s.length();i++)
    {
        int id=s[i]-‘0‘;
        if(p->next[id]==NULL)
            p->next[id]=creat_trie();
        p=p->next[id];
    }
}
void search_trie(trie *r,int k)
{
    int c=0;
    for(int i=0;i<10;i++)
    {
      if(r->next[i]!=NULL)
      {
       c++;
       search_trie(r->next[i],k);
      }
    }
    if(c==0&&r->v!=-1) {
    crt[k]++;
    r->v=-1;
   }
}
void print(trie *r)
{
    if(r->v==-1)
    {
       reverse(number.begin(),number.end());
       cout<<number<<" ";
       reverse(number.begin(),number.end());
       return ;
    }
      for(int i=0;i<10;i++)
   {
       if(r==root[now])
       number="";
       if(r->next[i]!=NULL)
       {
     number+=char(i+‘0‘);
       print(r->next[i]);
       number=number.substr(0,number.length()-1);
    }
   }

}
int main()
{
    int n,m;
    map<string,int>e;
    string a,b;
    cin>>n;
    memset(crt,0,sizeof(crt));
    for(int i=0;i<=n;i++)
      root[i]=creat_trie();
    while(n--)
    {
        cin>>a;
        if(e[a]==0)
         e[a]=++cnt;
        cin>>m;
        now=e[a];
        while(m--)
        {
            cin>>b;
            reverse(b.begin(),b.end());
            insert_trie(root[now],b,now);
        }
    }
    cout<<e.size()<<endl;
    map<string,int>::iterator it;
    for(it=e.begin();it!=e.end();it++)
    {
        cout<<it->first<<" ";
        now=it->second;
        search_trie(root[now],now);
        cout<<crt[now]<<" ";
        print(root[now]);
        cout<<endl;
    }
    return 0;
}

(好像还有个后缀树啥的……emmmm还没有学习……码着先)

D。Alarm Clock

是个前缀和+贪心的问题么……看大佬简洁的代码是那么处理的,自己搞得太复杂了……还……好多bug

需要好好想想哪些用前缀和处理更简洁,比如像这种多长时间内的,多大长度内的问题,可以考虑用前缀和?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k,b;
ll a[1000005];
int main()
{
    cin>>n>>m>>k;
    memset(a,0,sizeof(a));
    for(int i=0;i<n;i++)
    {
      cin>>b;
      a[b]=1;
    }
    int ans=0;
    for(int i=1;i<=m;i++)
    {
        a[i]+=a[i-1];
        if(a[i]>=k)
        {
            ans+=(a[i]-(k-1));
            a[i]=k-1;
        }
    }
    for(int i=m+1;i<1e6+5;i++)
    {
        a[i]+=a[i-1];
        b=a[i]-a[i-m];
        if(b>=k)
        {
            ans+=(b-k+1);
            a[i]=a[i-m]+k-1;
        }
    }
    cout<<ans<<endl;
    return 0;
}

E。Squares and not squares

想着暴力dfs我也是傻了……orz

依旧还是贪心,这次题……好多贪心……

2种情况……为平方数的个数m<=n/2,ans=(n/2-m)个非平方数变成平方数和的最小值

m>=n/2,ans=(m-n/2)个平方数变为非平方数和的最小值(非0值每个数只需要+1,0需要+2)//注意0需要特判,良心样例有没有啊!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a[200005],ans;
ll b[200005];
int main()
{
    cin>>n;
    int cnt=0,cnt0=0,cnt1=0;
    for(int i=0;i<n;i++)
    {
     cin>>a[i];
     ll c=sqrt(a[i]);
     ll minn=min(a[i]-pow(c,2),pow(c+1,2)-a[i]);
     b[i]=minn;
     if(b[i]==0)
      cnt++;
    if(a[i]==0) cnt0++;
    }
    if(cnt>=n/2&&cnt0<=n/2) ans=cnt-n/2;
    else if(cnt0>n/2)
        ans=cnt-cnt0+2*(cnt0-n/2);
    else
    {
        ans=0;
           sort(b,b+n);
        for(int i=0;i<n/2;i++)
           ans+=b[i];
    }
    cout<<ans<<endl;
    return 0;
}
时间: 2024-08-30 13:56:37

Codeforces Round #451 Div. 2 C D E的相关文章

Codeforces Round #451 (Div. 2) ABC

A. Rounding Vasya has a non-negative integer n. He wants to round it to nearest integer, which ends up with 0. If n already ends up with 0, Vasya considers it already rounded. For example, if n = 4722 answer is 4720. If n = 5 Vasya can round it to 0 

【Codeforces Round #451 (Div. 2) D】Alarm Clock

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法+二分. 类似滑动窗口. 即左端点为l,右端点为r. 维护a[r]-a[l]+1总是小于等于m的就好. (大于m就右移左端点) 然后看看里面的数字个数是不是小于k; 不是的话让l..r中最右边那个数字删掉就好. ->链表优化一下即可. [代码] /* 1.Shoud it use long long ? 2.Have you ever test several sample(at least therr) yourself

Codeforces Round #451 (Div. 2) F Restoring the Expression

题意: 有一个a+b=c的等式,去掉两个符号,把三个数连在一起得到一个数 给出这个数,要求还原等式,length <= 1e6 三个数不能含有前导0,保证有解 解法: 铁头过题法,分类然后各种判断 我分了5种情况 0.开头字符为0, 那么结果一定是0+a=a的形式 然后4种情况 1.len(a) >= len(b) 且 len(c) == len(a) 2.len(a) <= len(b) 且 len(c) == len(b) 3.len(a) >= len(b) 且 len(c)

Codeforces Round #451 (Div. 2) E

E. Squares and not squares Ann and Borya have n piles with candies and n is even number. There are ai candies in pile with number i. Ann likes numbers which are square of some integer and Borya doesn't like numbers which are square of any integer. Du

Codeforces Round #451 (Div. 2)【A,B,C,D,E】【C题:模拟 D题:尺取+贪心 E题:思维+优先队列维护最值】

特判最后一位即可 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 6 signed main(){ 7 int n;cin>>n;int t=n%10; 8 if(t==0) cout<<n; 9 else if(t>5) { 10 cout<<(n+10-t); 11 } 12 else { 13 cout<<(n-t); 14 }

Codeforces Round #258 (Div. 2) B. Sort the Array(简单题)

题目链接:http://codeforces.com/contest/451/problem/B ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

Codeforces Round #258 (Div. 2) A. Game With Sticks(数学题)

题目链接:http://codeforces.com/contest/451/problem/A ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿