• hdu--4407--一不留神就TLE了


    相比于上次我做过的一个容斥题 和他很相似 就是多了一个modify操作

    不过也不难 只要 通过 加加减减 操作就能完成了

    这个操作 我想过很多种方法 最后觉得用Map迭代访问是最好的选择

    如果遍历x->y这个区间 因为y<=400000可能会太大

    如果我记录操作1之前执行了多少次的操作2  然后来访问这些操作2  但是可能同一个位置上的数据被多次修改 这样统计也会出错

    这边 使用map还有一个原因 就是操作总共也就1000次 那么我最差的情况也就是修改了999次 询问了1次 那map里面最多也就是插入了999个元素 很快的

    ------

    然后我的tle也是发生在了map身上  还是我自己的思维不好 这个加加减减操作被我搞复杂了 后来去看了别人的 瞬间 fml

     1 void modify( LL x , LL y , LL p )
     2 {
     3     LL a , b c , d;
     4     map<LL,LL>::iterator it;
     5     for( it=mp.begin();it!=mp.end();it++ )
     6     {
     7         c = it->first;
     8         d = it-second;
     9         a = gcd( c , p );
    10         b = gcd( d , p );
    11         if( it->first == it->second || it->first<=x-1 || it->first >y )
    12         {
    13             continue;
    14         }
    15         else if( a==1 )
    16         {
    17             if( b==1 )
    18                 ans = ans - c + d;
    19             else
    20                 ans = ans - c;
    21         }
    22         else
    23         {
    24             if( b==1 )
    25                 ans = ans + d;
    26         }
    27     }
    28 }
     1 void modify( LL x , LL y , LL p )
     2 {
     3     map<LL,LL>::iterator it;
     4     for( it=mp.begin();it!=mp.end();it++ )
     5     {
     6         if( it->first == it->second || it->first<=x-1 || it->first >y )
     7         {
     8             continue;
     9         }
    10         if( gcd(it->first,p)==1 )
    11             ans-=it->first;
    12         if( gcd(it->second,p)==1 )
    13             ans+=it->second;
    14     }
    15 }

    第一个 罗里吧嗦的版本就是我写的 真TM 又臭又长啊  害我TLE了

      1 #include <iostream>
      2 #include <map>
      3 #include <vector>
      4 using namespace std;
      5 
      6 typedef long long LL;
      7 LL ans;
      8 vector<int> ve;
      9 map<LL,LL>mp;
     10 void getPrime( int n )
     11 {
     12     for( int i = 2 ; i<=n/i ; i++ )
     13     {
     14         if( n%i==0 )
     15         {
     16             ve.push_back( i );
     17             while( n%i==0 )
     18                 n /= i;
     19         }
     20     }
     21     if( n>1 )
     22         ve.push_back( n );
     23 }
     24 
     25 LL gcd( LL x , LL y )
     26 {
     27     return x % y == 0 ? y : gcd( y , x%y );
     28 }
     29 
     30 LL solve( LL x )
     31 {
     32     LL ans = 0 , var , num;
     33     int veSize = ve.size() , cnt;
     34     for( int i = 1 ; i<( 1<<veSize ) ; i++ )
     35     {
     36         var = 1;
     37         cnt = 0;
     38         for( int j = 0 ; j<veSize ; j++ )
     39         {
     40             if( i&(1<<j) )
     41             {
     42                 var = (LL) (var * ve[j]);
     43                 ++ cnt;
     44             }
     45         }
     46         num = x / var;
     47         if( cnt&1 )
     48             ans += num * ( var + num * var ) / 2;
     49         else
     50             ans -= num * ( var + num * var ) / 2;
     51     }
     52     return ans;
     53 }
     54 
     55 void modify( LL x , LL y , LL p )
     56 {
     57     map<LL,LL>::iterator it;
     58     for( it=mp.begin();it!=mp.end();it++ )
     59     {
     60         if( it->first == it->second || it->first<=x-1 || it->first >y )
     61         {
     62             continue;
     63         }
     64         if( gcd(it->first,p)==1 )
     65             ans-=it->first;
     66         if( gcd(it->second,p)==1 )
     67             ans+=it->second;
     68     }
     69 }
     70 
     71 int main()
     72 {
     73     cin.sync_with_stdio(false);
     74     int t , n , m , op;
     75     LL x , y , p , c , ans1 , ans2 , sum1 , sum2;
     76     cin >> t;
     77     while( t-- )
     78     {
     79         cin >> n >> m;
     80         mp.clear();
     81         while( m-- )
     82         {
     83             cin >> op;
     84             if( op==1 )
     85             {
     86                 cin >> x >> y >> p;
     87                 ve.clear( );
     88                 getPrime( p );
     89                 sum1 = (x-1) * x / 2;
     90                 ans1 = solve( x-1 );
     91                 sum2 = y * (y+1) / 2;
     92                 ans2 = solve( y );
     93                 ans = sum2 - ans2 - ( sum1 - ans1 );
     94                 modify( x , y , p );
     95                 cout << ans << endl;
     96             }
     97             else
     98             {
     99                 cin >> x >> c;
    100                 mp[x] = c;
    101             }
    102         }
    103     }
    104     return 0;
    105 }
    View Code


    这种题目 还有一个很烦的地方就是 要用到long long或者__int64来处理

    today:

      对于 性格 外向的女生 毫无 招架之力

    just follow your heart
  • 相关阅读:
    屏幕内跟随鼠标移动(鼠标点击一个位置,物体移动到该位置)
    su root认证失败的解决方法
    centos yum换阿里云源
    用户名 不在 sudoers文件中
    WebApi防重复提交方案
    解决Ubuntu安装openssh-server依赖问题
    # git 操作拾遗
    编译原理-词法分析05-正则表达式到DFA-01
    Content Negotiation in ASP.NET Web API
    Model Validation in ASP.NET Web API
  • 原文地址:https://www.cnblogs.com/radical/p/4069024.html
Copyright © 2020-2023  润新知