zoukankan      html  css  js  c++  java
  • 7.14 模拟赛

    7.14 模拟赛

    A 特殊的质数

    题意:求([A,B])之间的质数个数,并且满足(X=Q^2+P^2),(P,Q)是正整数。输出满足条件的数对((P,Q))的个数。(1leq Aleq Bleq 3*10^8)

    这数据范围对于 (O(n)) 来说是BT无疑,所以我们发现了一个新的东西:分块打表

    (3e8) 可以拆成 (3*10^3*10^5) ,也就是每 (10^5) 分成一块,记录一下答案个数,作为预处理好的数组,在查询时利用分块的思想,区间内整块的在表中查询,边角处的答案暴力枚举,时间复杂度不会超

    打表码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #define N 1000010
    #define M 300000010
    #define int long long
    using namespace std;
    template<typename T>
    inline void read(T &x){
    	x=0;bool flag=0;char c=getchar();
    	for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
    	for(;isdigit(c);c=getchar()) x=x*10+(c^48);
    	if(flag) x=-x;
    }
    
    int op[N],ans=0;
    
    void check(int x){
        for(int i=2;i*i<=x;i++){
            if(x%i==0) return; 
        }
        int j=18000;
        for(int i=1;op[i]<x;i++){
            while(op[i]+op[j]>x) j--;
            if(op[i]+op[j]==x){ans++;return;}
        }
    }
    
    signed main(){
    
        freopen("data1.out","w",stdout);
    
        for(int i=1;i<=18000;i++) op[i]=i*i;
        for(int i=1;i<=M;i++){
            check(i);
            if(i%100000==0) printf("%lld,",ans);
        }
      
    }
    

    提交码:

    include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #define N 1000010
    #define M 300000010
    #define int long long
    using namespace std;
    template<typename T>
    inline void read(T &x){
    	x=0;bool flag=0;char c=getchar();
    	for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
    	for(;isdigit(c);c=getchar()) x=x*10+(c^48);
    	if(flag) x=-x;
    }
    
    int op[N],ans=0;
    
    void check(int x){
        for(int i=2;i*i<=x;i++){
            if(x%i==0) return; 
        }
        int j=18000;
        for(int i=1;op[i]<x;i++){
            while(op[i]+op[j]>x) j--;
            if(op[i]+op[j]==x){ans++;return;}
        }
    }
    
    int poli[N]={
        0,       4783,    8977,    12980,   16900,   20731,   24522,   28248,
        31915,   35584,   39175,   42817,   46429,   49961,   53515,   57022,
        60522,   64039,   67488,   70984,   74416,   77878,   81284,   84678,
        88054,   91432,   94877,   98239,   101607,  104978,  108283,  111652,
        115038,  118374,  121694,  124996,  128269,  131625,  134911,  138218,
        141502,  144829,  148120,  151367,  154618,  157924,  161165,  164443,
        167674,  170945,  174193,  177432,  180616,  183843,  187047,  190282,
        193492,  196708,  199899,  203110,  206332,  209525,  212731,  215965,
        219122,  222271,  225462,  228650,  231843,  235068,  238260,  241442,
        244580,  247732,  250867,  253973,  257140,  260351,  263481,  266622,
        269759,  272884,  276013,  279148,  282270,  285395,  288555,  291709,
        294877,  297983,  301100,  304176,  307325,  310443,  313578,  316641,
        319812,  322903,  326006,  329105,  332180,  335267,  338393,  341464,
        344550,  347664,  350738,  353839,  356908,  359999,  363079,  366159,
        369260,  372327,  375438,  378517,  381634,  384727,  387816,  390919,
        393992,  397032,  400086,  403208,  406287,  409308,  412332,  415430,
        418498,  421555,  424568,  427582,  430659,  433679,  436752,  439790,
        442817,  445856,  448900,  451961,  454973,  457971,  461014,  464068,
        467134,  470152,  473177,  476214,  479249,  482264,  485274,  488278,
        491292,  494310,  497241,  500235,  503250,  506275,  509307,  512382,
        515413,  518403,  521397,  524427,  527421,  530471,  533468,  536441,
        539449,  542466,  545500,  548498,  551460,  554512,  557492,  560488,
        563513,  566513,  569507,  572480,  575502,  578463,  581444,  584483,
        587447,  590415,  593356,  596372,  599364,  602378,  605356,  608339,
        611345,  614315,  617283,  620282,  623218,  626203,  629186,  632136,
        635170,  638123,  641087,  644017,  646967,  649932,  652928,  655896,
        658856,  661818,  664770,  667742,  670675,  673687,  676669,  679671,
        682575,  685540,  688503,  691477,  694489,  697404,  700325,  703272,
        706180,  709114,  712112,  715037,  717988,  720959,  723895,  726881,
        729830,  732781,  735739,  738675,  741605,  744562,  747457,  750383,
        753317,  756216,  759187,  762198,  765149,  768086,  771011,  773927,
        776895,  779826,  782753,  785697,  788610,  791512,  794448,  797360,
        800285,  803240,  806179,  809115,  812027,  814962,  817867,  820795,
        823751,  826719,  829642,  832595,  835497,  838435,  841363,  844291,
        847193,  850079,  853021,  855894,  858874,  861760,  864671,  867591,
        870513,  873481,  876357,  879281,  882185,  885137,  888022,  890932,
        893856,  896757,  899685,  902572,  905459,  908420,  911331,  914213,
        917109,  920006,  922880,  925821,  928779,  931677,  934603,  937519,
        940452,  943325,  946294,  949180,  952087,  955025,  957870,  960725,
        963623,  966506,  969406,  972308,  975195,  978084,  980961,  983866,
        986745,  989646,  992537,  995404,  998271,  1001140, 1004046, 1006934,
        1009827, 1012697, 1015618, 1018496, 1021406, 1024320, 1027184, 1030063,
        1032961, 1035802, 1038721, 1041664, 1044520, 1047337, 1050174, 1053073,
        1055896, 1058797, 1061675, 1064499, 1067387, 1070267, 1073173, 1076028,
        1078882, 1081789, 1084691, 1087553, 1090412, 1093330, 1096220, 1099055,
        1101902, 1104800, 1107644, 1110567, 1113424, 1116308, 1119225, 1122065,
        1124940, 1127771, 1130651, 1133558, 1136474, 1139333, 1142194, 1145025,
        1147866, 1150737, 1153591, 1156489, 1159338, 1162243, 1165139, 1168042,
        1170910, 1173745, 1176590, 1179443, 1182369, 1185243, 1188092, 1190924,
        1193800, 1196659, 1199544, 1202431, 1205284, 1208197, 1211025, 1213867,
        1216687, 1219587, 1222392, 1225258, 1228118, 1230995, 1233829, 1236681,
        1239604, 1242421, 1245271, 1248111, 1250995, 1253791, 1256651, 1259536,
        1262362, 1265204, 1268046, 1270889, 1273688, 1276505, 1279376, 1282285,
        1285126, 1287979, 1290770, 1293579, 1296433, 1299248, 1302080, 1304898,
        1307764, 1310564, 1313436, 1316313, 1319178, 1321952, 1324798, 1327679,
        1330569, 1333416, 1336221, 1339090, 1341879, 1344729, 1347557, 1350401,
        1353251, 1356097, 1358924, 1361745, 1364528, 1367410, 1370265, 1373088,
        1375933, 1378786, 1381607, 1384447, 1387239, 1390061, 1392849, 1395708,
        1398554, 1401373, 1404178, 1407068, 1409898, 1412744, 1415625, 1418380,
        1421270, 1424099, 1426912, 1429774, 1432594, 1435429, 1438257, 1441128,
        1443938, 1446778, 1449604, 1452382, 1455247, 1458082, 1460919, 1463728,
        1466528, 1469368, 1472194, 1475030, 1477837, 1480666, 1483500, 1486322,
        1489165, 1491980, 1494786, 1497647, 1500452, 1503238, 1506080, 1508872,
        1511685, 1514526, 1517366, 1520183, 1523010, 1525805, 1528621, 1531401,
        1534200, 1536996, 1539893, 1542682, 1545502, 1548240, 1551092, 1553883,
        1556701, 1559564, 1562351, 1565116, 1567942, 1570715, 1573535, 1576358,
        1579175, 1581959, 1584771, 1587541, 1590355, 1593211, 1596004, 1598782,
        1601563, 1604385, 1607164, 1609973, 1612823, 1615616, 1618451, 1621216,
        1624006, 1626766, 1629635, 1632420, 1635221, 1637990, 1640856, 1643717,
        1646484, 1649296, 1652063, 1654853, 1657618, 1660459, 1663264, 1666080,
        1668891, 1671699, 1674593, 1677355, 1680124, 1682934, 1685690, 1688538,
        1691340, 1694100, 1696862, 1699638, 1702440, 1705277, 1708109, 1710911,
        1713724, 1716509, 1719266, 1722094, 1724879, 1727670, 1730435, 1733216,
        1736051, 1738806, 1741641, 1744420, 1747204, 1750006, 1752771, 1755536,
        1758336, 1761092, 1763838, 1766646, 1769443, 1772245, 1775045, 1777875,
        1780670, 1783463, 1786235, 1789018, 1791840, 1794679, 1797447, 1800273,
        1803073, 1805870, 1808646, 1811415, 1814142, 1816932, 1819706, 1822527,
        1825243, 1828004, 1830792, 1833547, 1836359, 1839213, 1841995, 1844791,
        1847580, 1850326, 1853088, 1855855, 1858662, 1861432, 1864206, 1866990,
        1869795, 1872539, 1875344, 1878116, 1880877, 1883645, 1886489, 1889296,
        1892074, 1894866, 1897678, 1900520, 1903295, 1906068, 1908796, 1911588,
        1914345, 1917128, 1919905, 1922736, 1925488, 1928317, 1931028, 1933872,
        1936617, 1939420, 1942194, 1944974, 1947726, 1950517, 1953326, 1956075,
        1958881, 1961652, 1964429, 1967230, 1969998, 1972723, 1975509, 1978237,
        1981016, 1983808, 1986617, 1989437, 1992204, 1994949, 1997720, 2000488,
        2003303, 2006032, 2008815, 2011606, 2014372, 2017179, 2019932, 2022701,
        2025512, 2028255, 2031019, 2033802, 2036609, 2039322, 2042135, 2044904,
        2047681, 2050501, 2053229, 2055970, 2058718, 2061483, 2064274, 2067034,
        2069779, 2072560, 2075348, 2078103, 2080844, 2083583, 2086329, 2089096,
        2091863, 2094671, 2097406, 2100184, 2102971, 2105737, 2108432, 2111258,
        2113989, 2116783, 2119526, 2122303, 2125068, 2127837, 2130617, 2133418,
        2136172, 2138961, 2141712, 2144480, 2147171, 2149923, 2152701, 2155441,
        2158236, 2161007, 2163757, 2166536, 2169246, 2171964, 2174705, 2177469,
        2180268, 2183017, 2185805, 2188546, 2191331, 2194099, 2196834, 2199595,
        2202323, 2205082, 2207859, 2210668, 2213443, 2216181, 2218952, 2221738,
        2224514, 2227245, 2230005, 2232707, 2235481, 2238230, 2240990, 2243755,
        2246479, 2249226, 2252024, 2254787, 2257553, 2260311, 2263078, 2265827,
        2268544, 2271244, 2274002, 2276735, 2279482, 2282216, 2284982, 2287746,
        2290511, 2293239, 2295996, 2298701, 2301493, 2304176, 2306930, 2309703,
        2312442, 2315162, 2317909, 2320690, 2323416, 2326185, 2328941, 2331675,
        2334373, 2337138, 2339870, 2342641, 2345410, 2348162, 2350886, 2353607,
        2356372, 2359138, 2361871, 2364677, 2367431, 2370148, 2372877, 2375650,
        2378387, 2381161, 2383895, 2386652, 2389449, 2392221, 2394901, 2397617,
        2400362, 2403098, 2405856, 2408602, 2411350, 2414126, 2416903, 2419626,
        2422295, 2425055, 2427744, 2430502, 2433250, 2436000, 2438718, 2441527,
        2444351, 2447015, 2449764, 2452481, 2455255, 2458030, 2460743, 2463428,
        2466186, 2468911, 2471678, 2474402, 2477112, 2479831, 2482616, 2485398,
        2488153, 2490868, 2493630, 2496330, 2499025, 2501803, 2504527, 2507233,
        2509985, 2512725, 2515472, 2518174, 2520874, 2523613, 2526329, 2529121,
        2531838, 2534603, 2537307, 2540007, 2542790, 2545540, 2548283, 2551054,
        2553801, 2556545, 2559255, 2562020, 2564749, 2567509, 2570147, 2572928,
        2575663, 2578402, 2581127, 2583835, 2586614, 2589383, 2592089, 2594818,
        2597535, 2600253, 2602943, 2605705, 2608393, 2611085, 2613805, 2616564,
        2619320, 2622047, 2624786, 2627469, 2630205, 2632915, 2635612, 2638343,
        2641067, 2643873, 2646580, 2649273, 2651922, 2654663, 2657388, 2660088,
        2662839, 2665563, 2668328, 2671038, 2673787, 2676539, 2679253, 2682013,
        2684760, 2687514, 2690184, 2692883, 2695613, 2698330, 2701066, 2703797,
        2706496, 2709173, 2711870, 2714584, 2717373, 2720151, 2722853, 2725558,
        2728235, 2730936, 2733697, 2736446, 2739145, 2741926, 2744681, 2747378,
        2750077, 2752810, 2755520, 2758289, 2761025, 2763724, 2766425, 2769152,
        2771909, 2774615, 2777362, 2780031, 2782758, 2785458, 2788180, 2790934,
        2793660, 2796374, 2799108, 2801843, 2804530, 2807260, 2809929, 2812654,
        2815399, 2818087, 2820816, 2823538, 2826275, 2828966, 2831688, 2834416,
        2837099, 2839798, 2842570, 2845295, 2847954, 2850685, 2853361, 2856130,
        2858813, 2861493, 2864214, 2866911, 2869648, 2872352, 2875060, 2877769,
        2880504, 2883225, 2885939, 2888660, 2891323, 2894041, 2896736, 2899481,
        2902172, 2904856, 2907605, 2910318, 2913025, 2915748, 2918452, 2921164,
        2923833, 2926596, 2929264, 2931965, 2934702, 2937421, 2940117, 2942866,
        2945635, 2948311, 2951034, 2953763, 2956446, 2959192, 2961880, 2964615,
        2967239, 2969937, 2972637, 2975366, 2978050, 2980754, 2983430, 2986122,
        2988901, 2991611, 2994330, 2997074, 2999798, 3002503, 3005202, 3007899,
        3010596, 3013323, 3016008, 3018742, 3021416, 3024128, 3026842, 3029541,
        3032257, 3034937, 3037646, 3040325, 3043021, 3045753, 3048457, 3051169,
        3053830, 3056532, 3059267, 3061962, 3064625, 3067351, 3069996, 3072754,
        3075489, 3078185, 3080940, 3083636, 3086304, 3089048, 3091765, 3094460,
        3097082, 3099790, 3102502, 3105213, 3107928, 3110675, 3113375, 3116120,
        3118821, 3121505, 3124225, 3126913, 3129662, 3132388, 3135040, 3137799,
        3140464, 3143178, 3145894, 3148594, 3151358, 3154059, 3156703, 3159380,
        3162036, 3164763, 3167421, 3170164, 3172859, 3175582, 3178275, 3180980,
        3183678, 3186335, 3189066, 3191740, 3194438, 3197143, 3199904, 3202632,
        3205349, 3208092, 3210814, 3213513, 3216211, 3218844, 3221530, 3224233,
        3226983, 3229663, 3232325, 3235039, 3237755, 3240411, 3243107, 3245792,
        3248447, 3251141, 3253793, 3256464, 3259117, 3261785, 3264498, 3267183,
        3269880, 3272565, 3275207, 3277989, 3280683, 3283347, 3286022, 3288732,
        3291421, 3294157, 3296808, 3299510, 3302208, 3304881, 3307586, 3310218,
        3312950, 3315657, 3318339, 3321023, 3323749, 3326371, 3329059, 3331729,
        3334386, 3337066, 3339777, 3342471, 3345125, 3347847, 3350544, 3353225,
        3355955, 3358629, 3361302, 3363968, 3366669, 3369386, 3372103, 3374795,
        3377476, 3380174, 3382884, 3385554, 3388180, 3390854, 3393550, 3396269,
        3398958, 3401657, 3404347, 3407021, 3409748, 3412423, 3415111, 3417798,
        3420475, 3423163, 3425803, 3428512, 3431139, 3433830, 3436494, 3439208,
        3441872, 3444596, 3447271, 3450004, 3452684, 3455325, 3458009, 3460715,
        3463432, 3466043, 3468739, 3471401, 3474094, 3476806, 3479442, 3482093,
        3484812, 3487497, 3490170, 3492859, 3495567, 3498296, 3500973, 3503651,
        3506386, 3509079, 3511782, 3514443, 3517153, 3519833, 3522519, 3525175,
        3527907, 3530581, 3533255, 3535968, 3538667, 3541337, 3543977, 3546666,
        3549375, 3552021, 3554738, 3557384, 3560089, 3562779, 3565456, 3568116,
        3570776, 3573440, 3576161, 3578837, 3581526, 3584201, 3586898, 3589607,
        3592223, 3594894, 3597608, 3600283, 3602936, 3605597, 3608314, 3611056,
        3613718, 3616374, 3619062, 3621778, 3624436, 3627137, 3629812, 3632493,
        3635171, 3637896, 3640545, 3643224, 3645880, 3648521, 3651241, 3653949,
        3656684, 3659418, 3662083, 3664726, 3667445, 3670104, 3672774, 3675492,
        3678171, 3680847, 3683589, 3686167, 3688864, 3691502, 3694148, 3696774,
        3699494, 3702150, 3704778, 3707475, 3710194, 3712860, 3715570, 3718228,
        3720906, 3723621, 3726325, 3729013, 3731696, 3734398, 3737056, 3739686,
        3742386, 3745051, 3747735, 3750446, 3753092, 3755762, 3758469, 3761124,
        3763797, 3766487, 3769100, 3771837, 3774511, 3777095, 3779798, 3782493,
        3785160, 3787803, 3790454, 3793099, 3795809, 3798470, 3801141, 3803840,
        3806531, 3809251, 3811892, 3814569, 3817239, 3819898, 3822593, 3825302,
        3827948, 3830625, 3833256, 3835965, 3838550, 3841205, 3843892, 3846530,
        3849183, 3851820, 3854487, 3857122, 3859808, 3862540, 3865212, 3867907,
        3870565, 3873196, 3875854, 3878497, 3881126, 3883819, 3886490, 3889195,
        3891881, 3894546, 3897253, 3899882, 3902459, 3905109, 3907778, 3910368,
        3913049, 3915711, 3918399, 3921048, 3923695, 3926400, 3929084, 3931737,
        3934442, 3937078, 3939771, 3942497, 3945190, 3947874, 3950554, 3953193,
        3955920, 3958644, 3961296, 3963905, 3966567, 3969210, 3971879, 3974535,
        3977154, 3979752, 3982459, 3985071, 3987719, 3990415, 3993125, 3995734,
        3998437, 4001108, 4003806, 4006463, 4009127, 4011826, 4014468, 4017139,
        4019845, 4022480, 4025095, 4027764, 4030423, 4033094, 4035733, 4038440,
        4041067, 4043776, 4046463, 4049120, 4051769, 4054423, 4057113, 4059770,
        4062450, 4065122, 4067793, 4070474, 4073175, 4075820, 4078472, 4081176,
        4083781, 4086434, 4089089, 4091773, 4094420, 4097098, 4099747, 4102416,
        4105055, 4107701, 4110355, 4113049, 4115721, 4118384, 4121051, 4123727,
        4126379, 4129049, 4131699, 4134352, 4137023, 4139685, 4142363, 4145060,
        4147676, 4150323, 4153010, 4155685, 4158363, 4160966, 4163596, 4166235,
        4168922, 4171605, 4174223, 4176869, 4179521, 4182182, 4184849, 4187488,
        4190140, 4192810, 4195421, 4198062, 4200731, 4203354, 4206044, 4208686,
        4211356, 4213981, 4216685, 4219356, 4221984, 4224627, 4227282, 4229914,
        4232564, 4235232, 4237861, 4240502, 4243169, 4245784, 4248401, 4251065,
        4253701, 4256359, 4259014, 4261660, 4264293, 4266921, 4269624, 4272263,
        4274956, 4277597, 4280201, 4282797, 4285398, 4288064, 4290687, 4293350,
        4296020, 4298653, 4301294, 4303981, 4306608, 4309217, 4311886, 4314528,
        4317234, 4319922, 4322592, 4325293, 4327911, 4330590, 4333233, 4335878,
        4338515, 4341143, 4343801, 4346450, 4349052, 4351734, 4354388, 4357048,
        4359662, 4362341, 4364925, 4367587, 4370298, 4372935, 4375552, 4378192,
        4380844, 4383574, 4386239, 4388878, 4391541, 4394199, 4396850, 4399520,
        4402186, 4404831, 4407486, 4410085, 4412693, 4415370, 4418022, 4420720,
        4423371, 4425991, 4428608, 4431242, 4433901, 4436579, 4439169, 4441822,
        4444489, 4447137, 4449672, 4452306, 4454922, 4457554, 4460240, 4462893,
        4465543, 4468139, 4470784, 4473456, 4476147, 4478749, 4481416, 4484075,
        4486723, 4489311, 4492006, 4494651, 4497292, 4499965, 4502618, 4505252,
        4507855, 4510572, 4513193, 4515918, 4518559, 4521185, 4523773, 4526426,
        4529072, 4531707, 4534346, 4536967, 4539592, 4542203, 4544860, 4547522,
        4550195, 4552843, 4555491, 4558140, 4560803, 4563437, 4566060, 4568705,
        4571336, 4574014, 4576656, 4579284, 4581976, 4584686, 4587325, 4589992,
        4592653, 4595265, 4597876, 4600571, 4603200, 4605816, 4608468, 4611139,
        4613736, 4616384, 4619005, 4621592, 4624231, 4626875, 4629507, 4632186,
        4634796, 4637398, 4640030, 4642677, 4645359, 4647918, 4650559, 4653230,
        4655888, 4658585, 4661189, 4663803, 4666450, 4669054, 4671704, 4674350,
        4676996, 4679632, 4682242, 4684948, 4687532, 4690160, 4692789, 4695462,
        4698102, 4700734, 4703362, 4706006, 4708642, 4711273, 4713899, 4716607,
        4719201, 4721852, 4724480, 4727183, 4729854, 4732495, 4735167, 4737850,
        4740485, 4743082, 4745720, 4748366, 4750949, 4753626, 4756288, 4758912,
        4761560, 4764204, 4766822, 4769429, 4772012, 4774672, 4777295, 4779966,
        4782596, 4785261, 4787904, 4790545, 4793166, 4795769, 4798435, 4801063,
        4803667, 4806332, 4808984, 4811622, 4814266, 4816890, 4819528, 4822160,
        4824804, 4827435, 4830057, 4832684, 4835378, 4837999, 4840680, 4843321,
        4845981, 4848639, 4851211, 4853837, 4856491, 4859126, 4861762, 4864387,
        4867027, 4869675, 4872295, 4874853, 4877528, 4880179, 4882797, 4885426,
        4888077, 4890745, 4893364, 4896010, 4898672, 4901285, 4903890, 4906511,
        4909156, 4911784, 4914383, 4917032, 4919689, 4922305, 4924918, 4927572,
        4930212, 4932817, 4935487, 4938139, 4940774, 4943378, 4946069, 4948679,
        4951296, 4953910, 4956557, 4959209, 4961877, 4964537, 4967184, 4969805,
        4972409, 4975038, 4977661, 4980310, 4982940, 4985646, 4988225, 4990897,
        4993515, 4996144, 4998801, 5001442, 5004056, 5006708, 5009405, 5012064,
        5014694, 5017339, 5019949, 5022571, 5025178, 5027801, 5030446, 5033046,
        5035680, 5038279, 5040862, 5043507, 5046094, 5048765, 5051411, 5054024,
        5056628, 5059277, 5061912, 5064511, 5067204, 5069824, 5072491, 5075113,
        5077658, 5080255, 5082859, 5085499, 5088134, 5090727, 5093332, 5095988,
        5098615, 5101202, 5103825, 5106458, 5109089, 5111743, 5114361, 5116966,
        5119590, 5122213, 5124844, 5127514, 5130153, 5132782, 5135430, 5138075,
        5140730, 5143345, 5145980, 5148605, 5151274, 5153899, 5156546, 5159149,
        5161733, 5164341, 5166953, 5169573, 5172231, 5174884, 5177521, 5180105,
        5182722, 5185363, 5187965, 5190595, 5193212, 5195880, 5198499, 5201125,
        5203796, 5206414, 5209049, 5211712, 5214288, 5216845, 5219487, 5222090,
        5224740, 5227386, 5230074, 5232641, 5235255, 5237882, 5240496, 5243170,
        5245786, 5248348, 5250963, 5253603, 5256294, 5258924, 5261559, 5264197,
        5266811, 5269431, 5272056, 5274677, 5277358, 5279980, 5282587, 5285175,
        5287824, 5290377, 5292983, 5295575, 5298143, 5300708, 5303299, 5305964,
        5308564, 5311159, 5313782, 5316422, 5319018, 5321596, 5324213, 5326784,
        5329409, 5332020, 5334622, 5337227, 5339867, 5342496, 5345129, 5347795,
        5350421, 5353089, 5355702, 5358367, 5360986, 5363544, 5366147, 5368776,
        5371411, 5374087, 5376686, 5379309, 5381928, 5384560, 5387171, 5389784,
        5392411, 5395045, 5397628, 5400259, 5402886, 5405526, 5408175, 5410793,
        5413433, 5415998, 5418614, 5421234, 5423861, 5426484, 5429132, 5431729,
        5434358, 5436988, 5439575, 5442163, 5444784, 5447429, 5450049, 5452629,
        5455225, 5457873, 5460457, 5463063, 5465635, 5468291, 5470839, 5473437,
        5476039, 5478623, 5481233, 5483861, 5486491, 5489061, 5491684, 5494276,
        5496929, 5499559, 5502194, 5504848, 5507483, 5510038, 5512630, 5515228,
        5517812, 5520450, 5523147, 5525739, 5528353, 5530959, 5533525, 5536135,
        5538820, 5541484, 5544170, 5546786, 5549333, 5551961, 5554593, 5557155,
        5559793, 5562400, 5564988, 5567667, 5570317, 5572921, 5575558, 5578172,
        5580734, 5583347, 5585967, 5588599, 5591256, 5593882, 5596536, 5599125,
        5601765, 5604342, 5606977, 5609543, 5612149, 5614794, 5617363, 5619973,
        5622603, 5625219, 5627889, 5630519, 5633084, 5635730, 5638331, 5640957,
        5643586, 5646178, 5648776, 5651327, 5653954, 5656615, 5659236, 5661890,
        5664466, 5667109, 5669723, 5672314, 5674897, 5677515, 5680111, 5682697,
        5685282, 5687872, 5690536, 5693137, 5695724, 5698353, 5700961, 5703596,
        5706172, 5708792, 5711417, 5713947, 5716607, 5719235, 5721869, 5724431,
        5727029, 5729669, 5732290, 5734926, 5737554, 5740150, 5742759, 5745302,
        5747921, 5750483, 5753108, 5755699, 5758283, 5760902, 5763487, 5766102,
        5768741, 5771328, 5773920, 5776525, 5779098, 5781661, 5784323, 5786982,
        5789589, 5792262, 5794903, 5797481, 5800088, 5802684, 5805348, 5807962,
        5810587, 5813144, 5815757, 5818374, 5820929, 5823532, 5826126, 5828741,
        5831422, 5834054, 5836687, 5839331, 5841892, 5844528, 5847109, 5849740,
        5852351, 5854946, 5857518, 5860153, 5862785, 5865405, 5868020, 5870661,
        5873254, 5875844, 5878519, 5881139, 5883728, 5886328, 5888951, 5891560,
        5894166, 5896790, 5899351, 5901945, 5904576, 5907198, 5909821, 5912398,
        5914979, 5917582, 5920156, 5922795, 5925411, 5928031, 5930671, 5933313,
        5935940, 5938527, 5941164, 5943776, 5946379, 5949000, 5951599, 5954205,
        5956844, 5959489, 5962106, 5964739, 5967357, 5969953, 5972549, 5975141,
        5977741, 5980357, 5982938, 5985528, 5988134, 5990732, 5993378, 5995954,
        5998499, 6001090, 6003726, 6006282, 6008886, 6011522, 6014157, 6016756,
        6019331, 6021858, 6024474, 6027081, 6029691, 6032263, 6034852, 6037495,
        6040040, 6042690, 6045298, 6047913, 6050498, 6053125, 6055661, 6058264,
        6060851, 6063463, 6066106, 6068703, 6071357, 6073901, 6076511, 6079116,
        6081674, 6084292, 6086845, 6089461, 6092065, 6094753, 6097312, 6099889,
        6102470, 6105112, 6107731, 6110281, 6112890, 6115532, 6118145, 6120761,
        6123305, 6125904, 6128579, 6131218, 6133812, 6136359, 6139004, 6141599,
        6144217, 6146819, 6149370, 6152007, 6154674, 6157270, 6159870, 6162460,
        6164975, 6167590, 6170167, 6172802, 6175449, 6178054, 6180644, 6183212,
        6185804, 6188461, 6191133, 6193760, 6196338, 6198882, 6201445, 6204005,
        6206614, 6209207, 6211824, 6214484, 6217046, 6219684, 6222251, 6224826,
        6227425, 6230024, 6232617, 6235253, 6237902, 6240567, 6243136, 6245744,
        6248382, 6250967, 6253593, 6256156, 6258703, 6261228, 6263771, 6266352,
        6268949, 6271544, 6274152, 6276724, 6279294, 6281849, 6284430, 6287078,
        6289702, 6292247, 6294879, 6297457, 6300082, 6302646, 6305224, 6307853,
        6310422, 6313001, 6315577, 6318145, 6320782, 6323412, 6326010, 6328576,
        6331171, 6333769, 6336394, 6339008, 6341629, 6344207, 6346738, 6349346,
        6351926, 6354520, 6357115, 6359726, 6362294, 6364934, 6367511, 6370123,
        6372758, 6375329, 6377931, 6380537, 6383125, 6385749, 6388316, 6390927,
        6393565, 6396155, 6398759, 6401308, 6403893, 6406443, 6409019, 6411620,
        6414239, 6416839, 6419443, 6421984, 6424584, 6427174, 6429773, 6432351,
        6434904, 6437477, 6440083, 6442693, 6445292, 6447929, 6450523, 6453110,
        6455681, 6458325, 6460916, 6463537, 6466170, 6468740, 6471303, 6473881,
        6476473, 6479074, 6481718, 6484299, 6486894, 6489471, 6492069, 6494655,
        6497313, 6499922, 6502518, 6505096, 6507691, 6510278, 6512872, 6515450,
        6518113, 6520674, 6523258, 6525867, 6528443, 6531065, 6533689, 6536272,
        6538886, 6541469, 6544020, 6546671, 6549284, 6551863, 6554451, 6556995,
        6559586, 6562187, 6564769, 6567410, 6569950, 6572573, 6575115, 6577699,
        6580259, 6582891, 6585455, 6588086, 6590707, 6593325, 6595956, 6598514,
        6601070, 6603685, 6606272, 6608833, 6611497, 6614094, 6616697, 6619294,
        6621893, 6624417, 6627011, 6629604, 6632210, 6634762, 6637326, 6639846,
        6642443, 6645042, 6647597, 6650123, 6652722, 6655350, 6657922, 6660524,
        6663027, 6665669, 6668207, 6670803, 6673401, 6676024, 6678602, 6681237,
        6683805, 6686330, 6688965, 6691554, 6694116, 6696710, 6699328, 6701945,
        6704526, 6707199, 6709794, 6712366, 6714982, 6717598, 6720188, 6722793,
        6725390, 6727967, 6730546, 6733133, 6735694, 6738206, 6740827, 6743393,
        6745967, 6748551, 6751152, 6753723, 6756298, 6758909, 6761488, 6764061,
        6766665, 6769184, 6771774, 6774394, 6776964, 6779496, 6782075, 6784633,
        6787248, 6789786, 6792399, 6795030, 6797653, 6800238, 6802809, 6805405,
        6807998, 6810600, 6813191, 6815769, 6818373, 6820938, 6823538, 6826056,
        6828647, 6831223, 6833808, 6836378, 6838974, 6841544, 6844145, 6846742,
        6849309, 6851865, 6854426, 6857052, 6859665, 6862300, 6864927, 6867490,
        6870030, 6872596, 6875181, 6877736, 6880326, 6882923, 6885470, 6888049,
        6890594, 6893239, 6895823, 6898360, 6900908, 6903507, 6906085, 6908591,
        6911193, 6913798, 6916350, 6918937, 6921531, 6924152, 6926759, 6929344,
        6932009, 6934557, 6937121, 6939698, 6942265, 6944832, 6947432, 6950047,
        6952621, 6955228, 6957810, 6960446, 6963002, 6965623, 6968228, 6970813,
        6973373, 6975907, 6978552, 6981141, 6983700, 6986302, 6988894, 6991451,
        6994052, 6996635, 6999238, 7001826, 7004385, 7006942, 7009508, 7012091,
        7014636, 7017246, 7019910, 7022467, 7025100, 7027732, 7030311, 7032872,
        7035445, 7038005, 7040536, 7043118, 7045743, 7048341, 7050887, 7053482,
        7056062, 7058670, 7061273, 7063884, 7066486, 7069098, 7071648, 7074207,
        7076793, 7079413, 7081991, 7084584, 7087181, 7089729, 7092252, 7094828,
        7097377, 7099974, 7102559, 7105135, 7107733, 7110340, 7112922, 7115504,
        7118104, 7120686, 7123328, 7125908, 7128528, 7131103, 7133675, 7136260,
        7138850, 7141411, 7143962, 7146531, 7149098, 7151677, 7154305, 7156894,
        7159501, 7162171, 7164743, 7167290, 7169861, 7172476, 7175069, 7177686,
        7180298, 7182858, 7185446, 7188009, 7190542, 7193110, 7195724, 7198305,
        7200836, 7203409, 7206025, 7208622, 7211220, 7213776, 7216338, 7218921,
        7221466, 7224117, 7226695, 7229223, 7231834, 7234447, 7237073, 7239660,
        7242247, 7244830, 7247437, 7250009, 7252623, 7255178, 7257776, 7260341,
        7262871, 7265455, 7267969, 7270544, 7273094, 7275707, 7278250, 7280850,
        7283409, 7285993, 7288559, 7291114, 7293744, 7296315, 7298847, 7301441,
        7304017, 7306654, 7309179, 7311704, 7314292, 7316886, 7319530, 7322111,
        7324658, 7327259, 7329880, 7332441, 7335021, 7337603, 7340209, 7342738,
        7345279, 7347816, 7350377, 7352944, 7355503, 7358024, 7360614, 7363209,
        7365831, 7368428, 7371012, 7373604, 7376144, 7378731, 7381275, 7383810,
        7386364, 7388932, 7391501, 7394031, 7396641, 7399244, 7401865, 7404456,
        7406981, 7409537, 7412101, 7414690, 7417287, 7419883, 7422440, 7424988,
        7427521, 7430100, 7432638, 7435215, 7437739, 7440293, 7442911, 7445515,
        7448113, 7450683, 7453260, 7455840, 7458444, 7461026, 7463634, 7466197,
        7468786, 7471319, 7473929, 7476551, 7479117, 7481640, 7484263, 7486780,
        7489341, 7491951, 7494520, 7497062, 7499687, 7502253, 7504814, 7507391,
        7509987, 7512552, 7515086, 7517706, 7520307, 7522823, 7525391, 7527944,
        7530542, 7533104, 7535699, 7538259, 7540803, 7543417, 7545942, 7548534,
        7551129, 7553728, 7556312, 7558843, 7561434, 7563979, 7566504, 7569079,
        7571640, 7574169, 7576782, 7579337, 7581896, 7584421, 7587021, 7589576,
        7592150, 7594704, 7597275, 7599793, 7602389, 7604972, 7607618, 7610136,
        7612747, 7615268, 7617857, 7620415, 7622959, 7625548, 7628195, 7630752,
        7633276, 7635833, 7638353, 7640909, 7643495, 7646120, 7648659, 7651278,
        7653832, 7656430, 7659010, 7661579, 7664133, 7666611, 7669192, 7671775,
        7674355, 7676914, 7679487, 7682030, 7684594, 7687145, 7689730, 7692292,
        7694860, 7697418, 7700030, 7702573, 7705204, 7707782, 7710347, 7712917,
        7715473, 7718027, 7720596, 7723206, 7725777, 7728304, 7730888, 7733441,
        7736037, 7738640, 7741177, 7743669, 7746198, 7748765, 7751406, 7753966,
        7756539, 7759094, 7761685, 7764212, 7766792, 7769378, 7771904, 7774460,
        7777034, 7779544, 7782118, 7784670, 7787225, 7789833, 7792384, 7795027,
        7797626, 7800193, 7802757, 7805345, 7807902, 7810458, 7812999, 7815576,
        7818154, 7820760, 7823284, 7825841, 7828444, 7830987, 7833549, 7836166,
        7838713, 7841311, 7843889, 7846421, 7848884, 7851433, 7853999, 7856582,
        7859171, 7861775, 7864363, 7866908, 7869477, 7872017, 7874590, 7877130,
        7879767, 7882313, 7884850, 7887427, 7890023, 7892631, 7895232, 7897843,
        7900428, 7902974, 7905545, 7908065, 7910581, 7913124, 7915727, 7918311,
        7920912, 7923469, 7926036, 7928633, 7931210, 7933765, 7936280, 7938827,
        7941377, 7943901, 7946431, 7949031, 7951601, 7954216, 7956759, 7959315,
        7961867, 7964450, 7967002, 7969566, 7972123, 7974693, 7977292, 7979865,
        7982412, 7985017, 7987568, 7990127, 7992721, 7995265, 7997860, 8000393,
        8002934, 8005472, 8008046, 8010614, 8013199, 8015752, 8018322, 8020861,
        8023412, 8025982, 8028498, 8031029, 8033582, 8036157, 8038757, 8041399,
        8043965, 8046481, 8049028, 8051590, 8054131, 8056747, 8059304, 8061848,
        8064376, 8066943, 8069507, 8072032, 8074667, 8077205, 8079781, 8082322,
        8084913, 8087509, 8090091, 8092567, 8095134, 8097677, 8100188, 8102725,
        8105255, 8107766, 8110336, 8112935, 8115466, 8118010, 8120630, 8123160,
        8125718};
    int l,r;
    
    signed main(){
    
        for(int i=1;i<=18000;i++) op[i]=i*i;
      
        read(l),read(r);
    
        int bl=l/100000,br=r/100000;
        if(bl+1<br) ans+=poli[br]-poli[bl+1];
        if(bl==br){
            for(int i=l;i<=r;i++) check(i);
        }else{
            for(int i=l;i<=(bl+1)*100000;i++) check(i);
            for(int i=br*100000+1;i<=r;i++) check(i);
        }
    
        printf("%lld
    ",ans);
    
    }
    

    (ycs;gg) 提供了一个结论:任何一个模 (4)(1) 的素数都能够被写成两个完全平方数的和

    有了这个结论判断合法就变得简单起来了,我们只需要筛出数据范围之内的质数然后判断是否模 (4)(1) 就行了

    码:

    #include<iostream>
    #include<bitset>
    #define re register
    #define N 300000000
    using namespace std;
    const int INF=0x3f3f3f3f;
    template<typename T>
    inline void read(T &x){
        x=0;bool flag=0;char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
        for(;isdigit(c);c=getchar()) x=x*10+(c^48);
        if(flag) x=-x;
    }
    
    int l,r;
    
    bitset<N+1> notp;
    int cnt,pri[16252327];
    inline void getpri(int x){
        //notp[1]=1;
        for(re int i=2;i<=x;i++){
            if(!notp[i]) pri[++cnt]=i;
            for(re int j=1;j<=cnt&&i*pri[j]<=x;j++){
                notp[i*pri[j]]=1;
                if(i%pri[j]==0) break;
            }
        }
    
        int ans=0;
        for(re int i=l;i<=r;i++) if(!notp[i]) ans+=(i%4==1);
        printf("%d
    ",ans);
    }
    
    signed main(){
    
        read(l),read(r);
        if(r==1) printf("0
    "),exit(0);
        getpri(r+1);
    
        return 0;
    }
    

    B 遥远的国度

    题意:给定一棵树,点有点权,支持路径上点修改、子树查询、换根三种操作

    先树剖,然后搬上线段树就可以解决前两个操作

    至于换根,我们不必真的进行换根,只需要一点点分类讨论就可以

    换根对路径上修改无影响

    当查询的子树的根节点 (x) 不在原根与新根的路径上时,换根对查询无影响

    当查询的子树的根节点 (x) 在原根与新根的路径上时,查询的结果为除去以原根与新根的路径上 (x) 的儿子为根的子树后的所有节点

    码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #define N 1000010
    #define mid ((l+r)>>1)
    #define int long long
    using namespace std;
    const int INF=0x7ffffffffffff;
    template<typename T>
    inline void read(T &x){
        x=0;bool flag=0;char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
        for(;isdigit(c);c=getchar()) x=x*10+(c^48);
        if(flag) x=-x;
    }
    
    int e[4*N],ne[4*N],h[N],idx,n,rt=1,m;
    int siz[N],f[N],d[N],ms[N],id[N],top[N],w[N],val[N],cnt=0;
    
    void add(int a,int b){
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }
    
    void dfs1(int x,int fa){
        siz[x]=1,f[x]=fa,d[x]=d[fa]+1;
        for(int i=h[x];~i;i=ne[i]){
            int j=e[i];
            if(j==fa) continue;
            dfs1(j,x);
            siz[x]+=siz[j];
            if(siz[j]>siz[ms[x]]) ms[x]=j;
        }
    }
    
    void dfs2(int x,int topp){
        top[x]=topp,id[x]=++cnt,w[cnt]=val[x];
        if(!ms[x]) return;
        dfs2(ms[x],topp);
        for(int i=h[x];~i;i=ne[i]){
            int j=e[i];
            if(j==f[x]||j==ms[x]) continue;
            dfs2(j,j);
        }
    }
    
    int lca(int x,int y){
        while(top[x]!=top[y]){
            if(d[top[x]]<d[top[y]]) swap(x,y);
            if(f[top[x]]==y) return top[x];
            x=f[top[x]];
        }
        if(d[x]<d[y]) swap(x,y);
        return ms[y];
    }
    
    int t[8*N],tag[8*N];
    
    void pushup(int x){
        t[x]=min(t[x<<1],t[x<<1|1]);
    }
    
    void build(int x,int l,int r){
        if(l==r){t[x]=w[l];return;}
        build(x<<1,l,mid);
        build(x<<1|1,mid+1,r);
        pushup(x);
    }
    
    void pushdown(int x){
        if(!tag[x]) return;
        t[x<<1]=tag[x];
        t[x<<1|1]=tag[x];
        tag[x<<1]=tag[x];
        tag[x<<1|1]=tag[x];
        tag[x]=0;
    }
    
    void change(int x,int l,int r,int cl,int cr,int k){
        if(cl<=l&&cr>=r){tag[x]=k,t[x]=k;return;}
        pushdown(x);
        if(cl<=mid) change(x<<1,l,mid,cl,cr,k);
        if(cr>mid) change(x<<1|1,mid+1,r,cl,cr,k);
        pushup(x);
    }
    
    int query(int x,int l,int r,int ql,int qr){
        if(ql<=l&&qr>=r) return t[x];
        pushdown(x);
        int res=INF;
        if(ql<=mid) res=min(query(x<<1,l,mid,ql,qr),res);
        if(qr>mid) res=min(query(x<<1|1,mid+1,r,ql,qr),res);
        return res;
    }
    
    void solve2(int x,int y,int k){
        while(top[x]!=top[y]){
            if(d[top[x]]<d[top[y]]) swap(x,y);
            change(1,1,n,id[top[x]],id[x],k);
            x=f[top[x]];
        }
        if(d[x]<d[y]) swap(x,y);
        change(1,1,n,id[y],id[x],k);
    }
    
    int solve3(int x){
        int tmp;
        if(x==rt) return t[1];
        else if(d[x]>=d[rt]) return query(1,1,n,id[x],id[x]+siz[x]-1);
        else if(f[tmp=lca(x,rt)]==x){
            return min(query(1,1,n,1,id[tmp]-1),query(1,1,n,id[tmp]+siz[tmp],n));
        }else return query(1,1,n,id[x],id[x]+siz[x]-1);
    }
    
    signed main(){
    
        memset(h,-1,sizeof h);
    
        read(n),read(m);
        for(int i=1;i<n;i++){
            int a,b;
            read(a),read(b);
            add(a,b),add(b,a);
        } 
        for(int i=1;i<=n;i++) read(val[i]);
    
        dfs1(1,0),dfs2(1,1),build(1,1,n);
    
        read(rt);
    
        for(int i=1;i<=m;i++){
            int opt,a,b,c;
            read(opt);
            if(opt==1){
                read(rt);
            }else if(opt==2){
                read(a),read(b),read(c);
                solve2(a,b,c);
            }else{
                read(a);
                printf("%lld
    ",solve3(a));
            }
        } 
    
        return 0;
    }
    

    C Rendezvous

    题意:对内向基环树森林求LCA

    拓扑排序/dfs找环

    记录每个点在环上的根以及每个环的编号

    对其进行分类讨论即可

    码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define N 500005
    //#define int long long
    using namespace std;
    template<typename T>
    inline void read(T &x){
        x=0;bool flag=0;char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
        for(;isdigit(c);c=getchar()) x=x*10+(c^48);
        if(flag) x=-x;
    }
    
    int e[N],ne[N],h[N],idx;
    int f[N][32],n,q,p[N],lg[N],bl[N],siz[N],id[N],d[N],dep[N],looprt[N],tot;
    bool is_loop[N];
    queue<int> que;
    
    //建反边
    void add(int a,int b){
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }
    
    //在环上的每个点都遍历一遍它的子树
    void dfs(int x,int fa,int rtf,int dth){
        dep[x]=dth;looprt[x]=rtf;
        for(int i=h[x];~i;i=ne[i]){
            int j=e[i];
            if(j==fa||!is_loop[j]) continue;
            dfs(j,x,rtf,dth+1);
        }
    }
    
    //找有多少环
    void getloop(int x,int ind,int step){
        if(id[x]) return;
        id[x]=step,siz[ind]++,bl[x]=ind;
        getloop(f[x][0],ind,step+1);
    }
    
    int lca(int x,int y){
        if(dep[x]>dep[y]) swap(x,y);
        int step=dep[y]-dep[x];
        for(int i=30;i>=0;i--) if(step&(1<<i)) y=f[y][i];
        if(x==y) return x;
        for(int i=30;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
        return f[x][0];
    }
    
    bool cmp(int a,int b,int c,int d){
        if(max(a,b)!=max(c,d)) return max(a,b)<max(c,d);
        if(min(a,b)!=min(c,d)) return min(a,b)<min(c,d);
        return a>=b;
    }
    
    signed main(){
    
        memset(h,-1,sizeof h);
    
        read(n),read(q);
        for(int i=1;i<=n;i++) p[i]=i,lg[i]=lg[i/2]+1;
        for(int i=1;i<=n;i++) read(f[i][0]),add(f[i][0],i),d[f[i][0]]++;
        for(int i=1;i<=n;i++) if(d[i]==0) que.push(i);
        while(!que.empty()){
            int x=que.front();
            is_loop[x]=1;
            que.pop();
            if(--d[f[x][0]]==0) que.push(f[x][0]);
        }
        
        for(int i=1;i<=n;i++){
            if(!is_loop[i]){
                dfs(i,0,i,0);
                if(!id[i]) getloop(i,++tot,1);
            }
        }
    
        for(int i=1;i<=30;i++){
            for(int j=1;j<=n;j++){
                f[j][i]=f[f[j][i-1]][i-1];
            }
        }
    
        while(q--){
            int a,b;
            read(a),read(b);
            int fx=looprt[a],fy=looprt[b];
            if(bl[fx]!=bl[fy]){printf("-1 -1
    ");continue;}
            else if(fx==fy){
                int l=lca(a,b);
                printf("%d %d
    ",dep[a]-dep[l],dep[b]-dep[l]);
            }else{
                int op1=dep[a]+(id[fy]-id[fx]+siz[bl[fx]])%siz[bl[fx]],op2=dep[b]+(id[fx]-id[fy]+siz[bl[fx]])%siz[bl[fx]];
                if(cmp(dep[a],op2,op1,dep[b])) printf("%d %d
    ",dep[a],op2);
                else printf("%d %d
    ",op1,dep[b]);
            }
        }
        return 0;
    }
    

    D 旅游

    树剖板子题,边权变点权,码量极大

    码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<string>
    #include<cmath>
    #include<vector>
    #include<map>
    #include<queue>
    #include<deque>
    #include<set>
    #include<stack>
    #include<bitset>
    #include<cstring>
    #define int long long
    #define ll long long
    #define mid ((l+r)>>1)
    using namespace std;
    const ll INF=0x3f3f3f3f3f,N=200010,Mod=1e9+7;
    
    inline int read(){
    	int 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-48;ch=getchar();}
    	return x*f;
    }
    
    int n,m;
    int cnt,h[N],e[N<<1],ne[N<<1],val[N<<1];
    
    
    int idx,fa[N],son[N],top[N],dep[N],dfn[N],siz[N],tmp[N],w[N];
    
    
    int sumn[N<<2],maxn[N<<2],minn[N<<2],lz[N<<2];
    
    
    struct node{
    	int x,y;
    }id[N];
    
    inline void add(int x,int y,int w){
    	ne[++cnt]=h[x];e[cnt]=y;val[cnt]=w;h[x]=cnt;
    }
    
    inline void dfs1(int x,int f){
    	dep[x]=dep[f]+1;fa[x]=f;siz[x]=1;
    	for(int i=h[x];i;i=ne[i]){
    		int v=e[i];
    		if(v==f) continue;
    		dfs1(v,x);
    		tmp[v]=val[i];
    		siz[x]+=siz[v];
    		if(siz[son[x]]<siz[v]) son[x]=v;
    	}
    }
    
    inline void dfs2(int x,int topf){
    	dfn[x]=++idx;w[idx]=tmp[x];top[x]=topf;
    	if(son[x]) dfs2(son[x],topf);
    	for(int i=h[x];i;i=ne[i]){
    		int v=e[i];
    		if(v==fa[x]||v==son[x]) continue;
    		dfs2(v,v);
    	}
    }
    inline void pushup(int rt){
    	sumn[rt]=sumn[rt<<1]+sumn[rt<<1|1];
    	maxn[rt]=max(maxn[rt<<1],maxn[rt<<1|1]);
    	minn[rt]=min(minn[rt<<1],minn[rt<<1|1]);
    }
    
    inline void build(int rt,int l,int r){
    	if(l==r){
    		sumn[rt]=maxn[rt]=minn[rt]=w[l];
    		return;
    	}
    	build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
    	pushup(rt);
    }
    
    inline void pushdown(int rt){
    	lz[rt<<1]^=1;lz[rt<<1|1]^=1;
    	sumn[rt<<1]=-sumn[rt<<1];sumn[rt<<1|1]=-sumn[rt<<1|1];
    	maxn[rt<<1]=-maxn[rt<<1];maxn[rt<<1|1]=-maxn[rt<<1|1];
    	minn[rt<<1]=-minn[rt<<1];minn[rt<<1|1]=-minn[rt<<1|1];
    	swap(maxn[rt<<1],minn[rt<<1]);
    	swap(maxn[rt<<1|1],minn[rt<<1|1]);
    	lz[rt]=0;
    }
    
    inline void update(int rt,int l,int r,int q,int k){
    	if(l==r){
    		sumn[rt]=maxn[rt]=minn[rt]=k;
    		return;
    	}
    	if(lz[rt]) pushdown(rt);
    	if(q<=mid) update(rt<<1,l,mid,q,k);
    	if(q>mid)  update(rt<<1|1,mid+1,r,q,k);
    	pushup(rt);
    }
    
    inline void change(int rt,int l,int r,int L,int R){
    	if(L<=l&&r<=R){
    		lz[rt]^=1;
    		sumn[rt]=-sumn[rt];
    		maxn[rt]=-maxn[rt];
    		minn[rt]=-minn[rt];
    		swap(maxn[rt],minn[rt]);
    		return;
    	}
    	if(lz[rt]) pushdown(rt);
    	if(L<=mid) change(rt<<1,l,mid,L,R);
    	if(R>mid)  change(rt<<1|1,mid+1,r,L,R);
    	pushup(rt);
    }
    
    inline int qsum(int rt,int l,int r,int L,int R){
    	int res=0;
    	if(L<=l&&r<=R) return sumn[rt];
    	if(lz[rt]) pushdown(rt);
    	if(L<=mid) res+=qsum(rt<<1,l,mid,L,R);
    	if(R>mid)  res+=qsum(rt<<1|1,mid+1,r,L,R);
    	pushup(rt);
    	return res;
    }
    
    inline int qmax(int rt,int l,int r,int L,int R){
    	int res=-2147483647;
    	if(L<=l&&r<=R) return maxn[rt];
    	if(lz[rt]) pushdown(rt);
    	if(L<=mid) res=max(res,qmax(rt<<1,l,mid,L,R));
    	if(R>mid)  res=max(res,qmax(rt<<1|1,mid+1,r,L,R));
    	pushup(rt);
    	return res;
    }
    
    inline int qmin(int rt,int l,int r,int L,int R){
    	int res=2147483647;
    	if(L<=l&&r<=R) return minn[rt];
    	if(lz[rt]) pushdown(rt);
    	if(L<=mid) res=min(res,qmin(rt<<1,l,mid,L,R));
    	if(R>mid)  res=min(res,qmin(rt<<1|1,mid+1,r,L,R));
    	pushup(rt);
    	return res;
    }
    
    inline void update(int x,int y){
    	while(top[x]!=top[y]){
    		if(dep[top[x]]<dep[top[y]]) swap(x,y);
    		change(1,1,n,dfn[top[x]],dfn[x]);
    		x=fa[top[x]];
    	}
    	if(dep[x]>dep[y]) swap(x,y);
    	if(x!=y) change(1,1,n,dfn[x]+1,dfn[y]);
    }
    
    inline int qsum(int x,int y){
    	int res=0;
    	while(top[x]!=top[y]){
    		if(dep[top[x]]<dep[top[y]]) swap(x,y);
    		res+=qsum(1,1,n,dfn[top[x]],dfn[x]);
    		x=fa[top[x]];
    	}
    	if(dep[x]>dep[y]) swap(x,y);
    	if(x!=y) res+=qsum(1,1,n,dfn[x]+1,dfn[y]);
    	return res;
    }
    
    inline int qmax(int x,int y){
    	int res=-2147483647;
    	while(top[x]!=top[y]){
    		if(dep[top[x]]<dep[top[y]]) swap(x,y);
    		res=max(res,qmax(1,1,n,dfn[top[x]],dfn[x]));
    		x=fa[top[x]];
    	}
    	if(dep[x]>dep[y]) swap(x,y);
    	if(x!=y) res=max(res,qmax(1,1,n,dfn[x]+1,dfn[y]));
    	return res;
    }
    
    inline int qmin(int x,int y){
    	int res=2147483647;
    	while(top[x]!=top[y]){
    		if(dep[top[x]]<dep[top[y]]) swap(x,y);
    		res=min(res,qmin(1,1,n,dfn[top[x]],dfn[x]));
    		x=fa[top[x]];
    	}
    	if(dep[x]>dep[y]) swap(x,y);
    	if(x!=y) res=min(res,qmin(1,1,n,dfn[x]+1,dfn[y]));
    	return res;
    }
    
    signed main(){
    	n=read();
    	for(int i=1;i<n;i++){
    		int a,b,c;
    		a=read()+1;b=read()+1;c=read();
    		add(a,b,c);add(b,a,c);
    		id[i].x=a;id[i].y=b;
    	}
    	dfs1(1,0);dfs2(1,1);
    	build(1,1,n);
    	m=read();
    	while(m--){
    		char s[10];int a,b;
    		scanf("%s",s);a=read();b=read();
    		if(s[0]=='C'){
    			int tmpp;
    			if(dep[id[a].x]>dep[id[a].y]) tmpp=id[a].x;
    			else tmpp=id[a].y;
    			update(1,1,n,dfn[tmpp],b);
    		}
    		else if(s[0]=='N'){
    			a++,b++;
    			update(a,b);
    		}
    		else if(s[0]=='S'){
    			a++,b++;
    			printf("%lld
    ",qsum(a,b));
    		}
    		else if(s[0]=='M'&&s[1]=='A'){
    			a++,b++;
    			printf("%lld
    ",qmax(a,b));
    		}
    		else if(s[0]=='M'&&s[1]=='I'){
    			a++,b++;
    			printf("%lld
    ",qmin(a,b));
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Jenkins配置钉钉通知
    Jenkins 学习笔记
    2020年10月26日Britain suggests it may overturn parts of the EU withdrawal agreement
    【火爆抢答中】HarmonyOS有奖问答,更多惊喜等你来拿!
    三七互娱《斗罗大陆:魂师对决》上线,Network Kit助力玩家即刻畅玩
    运动健康南向设备接入服务传输数据解析举例
    华为商品管理系统批量更新商品时提示:请至少输入一组国家码和价格
    云空间服务,助力用户数据存储与协同
    Input组件无点击效果
    华为视频编辑服务(Video Editor Kit),助力开发者高效构建应用视频编辑能力
  • 原文地址:https://www.cnblogs.com/wsyunine/p/15015534.html
Copyright © 2011-2022 走看看